singrdk/base/Windows/csic/codedom/codedom2.cs

1641 lines
62 KiB
C#

using System;
using System.Collections;
using System.CodeDom;
public class AST2CodeDom2 {
private class Unsupported : Exception {
public Unsupported(string s) : base(s) {
}
}
public static compilation visit(compilation ast, System.IO.TextWriter w, string[] args, MessageWriter msg) {
if (msg.Count > 0)
return ast;
System.CodeDom.Compiler.CodeDomProvider cdp = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.ICodeGenerator icg = cdp.CreateGenerator();
System.CodeDom.Compiler.CodeGeneratorOptions cgo = new System.CodeDom.Compiler.CodeGeneratorOptions();
foreach (compilation_unit cu in ast.inputs) {
CodeCompileUnit cd = emit_compilation_unit(cu);
icg.GenerateCodeFromCompileUnit(cd, System.Console.Out, cgo);
}
return ast;
}
public static CodeCompileUnit Compile(compilation_unit cu) {
return emit_compilation_unit(cu);
}
private static CodeTypeReference emit_name_type(name_type p) {
string t0 = dotted2string(p.name);
CodeTypeReference c = new CodeTypeReference(t0);
c.UserData["AST"] = p;
return c;
} // emit_name_type
private static CodeExpression emit_simple_name_expr(simple_name p) {
return (CodeExpression) emit_simple_name(p);
}
private static bool isInsideAccessor(AST p) {
for (AST a = p; a != null; a = a.parent) {
if (a is accessor_declaration) {
accessor_declaration ad = (accessor_declaration) a;
if (ad.id.str == "set") {
return true;
}
}
}
return false;
}
private static CodeObject emit_simple_name(simple_name p) {
CodeObject o = null;
CodeThisReferenceExpression self = null;
if (p.sym.IsInstance) {
self = new CodeThisReferenceExpression();
self.UserData["AST"] = p;
}
if (p.sym is MethodSuite) {
if (p.sym.IsInstance) {
CodeMethodReferenceExpression mr = new CodeMethodReferenceExpression();
mr.UserData["AST"] = p;
mr.MethodName = p.id.str;
mr.TargetObject = self;
o = mr;
} else {
throw new Unsupported("unhandled sym type");
}
} else if (p.sym is Formal) {
if (p.id.str == "value" && isInsideAccessor(p)) {
CodePropertySetValueReferenceExpression psvre = new CodePropertySetValueReferenceExpression();
psvre.UserData["AST"] = p;
return psvre;
}
CodeArgumentReferenceExpression ar = new CodeArgumentReferenceExpression();
ar.UserData["AST"] = p;
ar.ParameterName = p.id.str;
o = ar;
} else if (p.sym is Local) {
CodeVariableReferenceExpression lr = new CodeVariableReferenceExpression();
lr.UserData["AST"] = p;
lr.VariableName = p.id.str;
o = lr;
} else if (p.sym is Field) {
if (p.sym.IsInstance) {
CodeFieldReferenceExpression fr = new CodeFieldReferenceExpression();
fr.UserData["AST"] = p;
fr.FieldName = p.id.str;
fr.TargetObject = self;
o = fr;
} else {
throw new Unsupported("unhandled sym type");
}
} else if (p.sym is Property) {
if (p.sym.IsInstance) {
CodePropertyReferenceExpression pr = new CodePropertyReferenceExpression();
pr.UserData["AST"] = p;
pr.PropertyName = p.id.str;
pr.TargetObject = self;
o = pr;
} else {
throw new Unsupported("unhandled sym type");
}
} else if (p.sym is Event) {
if (p.sym.IsInstance) {
CodeEventReferenceExpression er = new CodeEventReferenceExpression();
er.UserData["AST"] = p;
er.EventName = p.id.str;
er.TargetObject = self;
o = er;
} else {
throw new Unsupported("unhandled sym type");
}
} else {
throw new Unsupported("unhandled sym type: " + p.sym.ToString());
}
return o;
} // emit_simple_name
private static CodeStatement emit_expression_statement(expression_statement p) {
if (p.expr is assignment_expression) {
return emit_assignment_statement((assignment_expression)p.expr);
}
if (p.expr is compound_assignment_expression) {
return emit_compound_assignment_statement((compound_assignment_expression)p.expr);
}
CodeExpressionStatement es = new CodeExpressionStatement();
es.UserData["AST"] = es;
CodeExpression t0 = emit_expression(p.expr);
es.Expression = t0;
return es;
} // emit_expression_statement
private static string get_member_name(member_name p) {
string name = p.id.str;
if (p.ty != null) {
// WARNING: unimplemented interface names: member_name.ty
}
return name;
} // get_member_name
private static CodeCompileUnit emit_compilation(compilation p) {
// WARNING: need to fix this
foreach (compilation_unit x in p.inputs) {
return emit_compilation_unit(x);
}
return null;
}
private static CodeAttributeDeclarationCollection emit_attribute_sections(attribute_sectionList attrs) {
CodeAttributeDeclarationCollection adc = new CodeAttributeDeclarationCollection();
foreach (attribute_section attr_section in attrs) {
emit_attribute_section(attr_section, adc);
}
return adc;
}
private static void emit_attribute_section(attribute_section p, CodeAttributeDeclarationCollection cadc) {
foreach (attribute attr in p.attributes) {
CodeAttributeDeclaration ad = emit_attribute(attr);
cadc.Add(ad);
}
}
private static CodeCompileUnit emit_compilation_unit(compilation_unit p) {
CodeCompileUnit cu = new CodeCompileUnit();
try {
emit_compilation_unit0(p, cu);
} catch (Unsupported u) {
cu.Namespaces[0].Comments.Add(new CodeCommentStatement("CodeDom Error: " + u.Message));
}
return cu;
}
private static CodeCompileUnit emit_compilation_unit0(compilation_unit p, CodeCompileUnit cu) {
CodeNamespace globals = new CodeNamespace();
globals.UserData["AST"] = p;
cu.Namespaces.Add(globals);
cu.UserData["AST"] = p;
foreach (using_directive k in p.using_directives) {
CodeNamespaceImport s = emit_using_directive(k);
globals.Imports.Add(s);
}
cu.AssemblyCustomAttributes.AddRange(emit_attribute_sections(p.attributes));
foreach (declaration k in p.declarations) {
if (k is namespace_declaration) {
CodeNamespace ns = emit_namespace_declaration((namespace_declaration) k);
cu.Namespaces.Add(ns);
} else {
CodeTypeDeclaration td = (CodeTypeDeclaration) emit_declaration(k);
globals.Types.Add(td);
}
}
return cu;
} // emit_compilation_unit
private static string dotted2string(dotted_name p) {
return ((p.left != null) ? dotted2string(p.left) + "." : "") + p.right.str;
} // dotted2string
private static CodeTypeReference emit_type(type p) {
if (p is name_type)
return emit_name_type((name_type) p);
if (p is bool_type)
return emit_bool_type((bool_type) p);
if (p is decimal_type)
return emit_decimal_type((decimal_type) p);
if (p is sbyte_type)
return emit_sbyte_type((sbyte_type) p);
if (p is byte_type)
return emit_byte_type((byte_type) p);
if (p is short_type)
return emit_short_type((short_type) p);
if (p is ushort_type)
return emit_ushort_type((ushort_type) p);
if (p is int_type)
return emit_int_type((int_type) p);
if (p is uint_type)
return emit_uint_type((uint_type) p);
if (p is long_type)
return emit_long_type((long_type) p);
if (p is ulong_type)
return emit_ulong_type((ulong_type) p);
if (p is char_type)
return emit_char_type((char_type) p);
if (p is float_type)
return emit_float_type((float_type) p);
if (p is double_type)
return emit_double_type((double_type) p);
if (p is object_type)
return emit_object_type((object_type) p);
if (p is string_type)
return emit_string_type((string_type) p);
if (p is array_type)
return emit_array_type((array_type) p);
if (p is void_type)
return emit_void_type((void_type) p);
if (p is pointer_type)
return emit_pointer_type((pointer_type) p);
if (p is void_pointer_type)
return emit_void_pointer_type((void_pointer_type) p);
throw new Unsupported(p.ToString());
} // emit_type
private static CodeTypeReference emit_bool_type(bool_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(bool));
tr.UserData["AST"] = p;
return tr;
} // emit_bool_type
private static CodeTypeReference emit_decimal_type(decimal_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(decimal));
tr.UserData["AST"] = p;
return tr;
} // emit_decimal_type
private static CodeTypeReference emit_sbyte_type(sbyte_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(sbyte));
tr.UserData["AST"] = p;
return tr;
} // emit_sbyte_type
private static CodeTypeReference emit_byte_type(byte_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(byte));
tr.UserData["AST"] = p;
return tr;
} // emit_byte_type
private static CodeTypeReference emit_short_type(short_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(short));
tr.UserData["AST"] = p;
return tr;
} // emit_short_type
private static CodeTypeReference emit_ushort_type(ushort_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(ushort));
tr.UserData["AST"] = p;
return tr;
} // emit_ushort_type
private static CodeTypeReference emit_int_type(int_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(int));
tr.UserData["AST"] = p;
return tr;
} // emit_int_type
private static CodeTypeReference emit_uint_type(uint_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(uint));
tr.UserData["AST"] = p;
return tr;
} // emit_uint_type
private static CodeTypeReference emit_long_type(long_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(long));
tr.UserData["AST"] = p;
return tr;
} // emit_long_type
private static CodeTypeReference emit_ulong_type(ulong_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(ulong));
tr.UserData["AST"] = p;
return tr;
} // emit_ulong_type
private static CodeTypeReference emit_char_type(char_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(char));
tr.UserData["AST"] = p;
return tr;
} // emit_char_type
private static CodeTypeReference emit_float_type(float_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(float));
tr.UserData["AST"] = p;
return tr;
} // emit_float_type
private static CodeTypeReference emit_double_type(double_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(double));
tr.UserData["AST"] = p;
return tr;
} // emit_double_type
private static CodeTypeReference emit_object_type(object_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(object));
tr.UserData["AST"] = p;
return tr;
} // emit_object_type
private static CodeTypeReference emit_string_type(string_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(string));
tr.UserData["AST"] = p;
return tr;
} // emit_string_type
private static CodeTypeReference emit_array_type(array_type p) {
CodeTypeReference t0 = emit_type(p.ty);
CodeTypeReference tr = new CodeTypeReference(t0, p.rank_specifier);
tr.UserData["AST"] = p;
return tr;
} // emit_array_type
private static CodeExpression emit_argument(argument p) {
CodeExpression e = emit_expression(p.expr);
if (p.kind != null) {
switch (p.kind.tag) {
case "ref":
e = new CodeDirectionExpression(FieldDirection.Ref, e);
e.UserData["AST"] = p;
break;
case "out":
e = new CodeDirectionExpression(FieldDirection.Out, e);
e.UserData["AST"] = p;
break;
default:
throw new Unsupported("CodeDOM does not support: " + p.kind.tag);
}
}
return e;
} // emit_argument
private static CodeExpression emit_expression(expression p) {
if (p is simple_name)
return emit_simple_name_expr((simple_name) p);
if (p is literal)
return emit_literal((literal) p);
if (p is member_access)
return emit_member_access((member_access) p);
if (p is invocation_expression)
return emit_invocation_expression((invocation_expression) p);
if (p is element_access)
return emit_element_access((element_access) p);
if (p is this_access)
return emit_this_access((this_access) p);
if (p is base_access)
return emit_base_access((base_access) p);
if (p is post_expression)
return emit_post_expression((post_expression) p);
if (p is new_expression)
return emit_new_expression((new_expression) p);
if (p is array_creation_expression1)
return emit_array_creation_expression1((array_creation_expression1) p);
if (p is array_creation_expression2)
return emit_array_creation_expression2((array_creation_expression2) p);
if (p is typeof_expression)
return emit_typeof_expression((typeof_expression) p);
if (p is checked_expression)
return emit_checked_expression((checked_expression) p);
if (p is unchecked_expression)
return emit_unchecked_expression((unchecked_expression) p);
if (p is unary_expression)
return emit_unary_expression((unary_expression) p);
if (p is pre_expression)
return emit_pre_expression((pre_expression) p);
if (p is cast_expression)
return emit_cast_expression((cast_expression) p);
if (p is binary_expression)
return emit_binary_expression((binary_expression) p);
if (p is is_expression)
return emit_is_expression((is_expression) p);
if (p is as_expression)
return emit_as_expression((as_expression) p);
if (p is cond_expression)
return emit_cond_expression((cond_expression) p);
if (p is assignment_expression)
return emit_assignment_expression((assignment_expression) p);
if (p is compound_assignment_expression)
return emit_compound_assignment_expression((compound_assignment_expression) p);
if (p is sizeof_expression)
return emit_sizeof_expression((sizeof_expression) p);
if (p is implicit_cast_expression)
return emit_implicit_cast_expression((implicit_cast_expression) p);
throw new Unsupported(p.ToString());
} // emit_expression
private static CodeExpression emit_literal(literal p) {
if (p is integer_literal)
return emit_integer_literal((integer_literal) p);
if (p is real_literal)
return emit_real_literal((real_literal) p);
if (p is character_literal)
return emit_character_literal((character_literal) p);
if (p is string_literal)
return emit_string_literal((string_literal) p);
if (p is boolean_literal)
return emit_boolean_literal((boolean_literal) p);
if (p is null_literal)
return emit_null_literal((null_literal) p);
throw new Unsupported(p.ToString());
} // emit_literal
private static CodePrimitiveExpression emit_integer_literal(integer_literal p) {
CodePrimitiveExpression pe = new CodePrimitiveExpression(p.value);
pe.UserData["AST"] = p;
return pe;
} // emit_integer_literal
private static CodePrimitiveExpression emit_real_literal(real_literal p) {
CodePrimitiveExpression pe = new CodePrimitiveExpression(p.value);
pe.UserData["AST"] = p;
return pe;
} // emit_real_literal
private static CodePrimitiveExpression emit_character_literal(character_literal p) {
CodePrimitiveExpression pe = new CodePrimitiveExpression(p.value);
pe.UserData["AST"] = p;
return pe;
} // emit_character_literal
private static CodePrimitiveExpression emit_string_literal(string_literal p) {
CodePrimitiveExpression pe = new CodePrimitiveExpression(p.value);
pe.UserData["AST"] = p;
return pe;
} // emit_string_literal
private static CodePrimitiveExpression emit_boolean_literal(boolean_literal p) {
CodePrimitiveExpression pe = new CodePrimitiveExpression(p.value);
pe.UserData["AST"] = p;
return pe;
} // emit_boolean_literal
private static CodePrimitiveExpression emit_null_literal(null_literal p) {
CodePrimitiveExpression pe = new CodePrimitiveExpression(p.value);
pe.UserData["AST"] = p;
return pe;
} // emit_null_literal
private static CodeExpression emit_member_access(member_access p) {
if (p is expr_access)
return emit_expr_access((expr_access) p);
if (p is pointer_access)
return emit_pointer_access((pointer_access) p);
if (p is predefined_access)
return emit_predefined_access((predefined_access) p);
throw new Unsupported(p.ToString());
} // emit_member_access
private static CodeExpression emit_expr_access(expr_access p) {
CodeExpression e;
//
//string ns = null;
//Type lhsType = null;
//if (p.expr is simple_name) {
// simple_name s = (simple_name) p.expr;
// if (s.sym is NameSpace) {
// NameSpace n = (NameSpace) s.sym;
// ns = n.FullName;
// } else if (s.sym is Type) {
// lhsType = (Type) s.sym;
// }
//} else if (p.expr is expr_access) {
// expr_access ea = (expr_access) p.expr;
// if (ea.sym is NameSpace) {
// NameSpace n = (NameSpace) ea.sym;
// ns = n.FullName;
// } else if (ea.sym is Type) {
// lhsType = (Type) ea.sym;
// }
//}
//
CodeExpression t0 = emit_expression(p.expr);
string id = p.id.str;
if (p.sym is ClassType) {
throw new Unsupported("unhandled ClassType in expr access");
} else if (p.sym is MethodSuite) {
e = t0;
} else if (p.sym is Field) {
CodeFieldReferenceExpression fre = new CodeFieldReferenceExpression();
fre.UserData["AST"] = p;
fre.FieldName = id;
fre.TargetObject = t0;
e = fre;
} else if (p.sym is Property) {
CodePropertyReferenceExpression pre = new CodePropertyReferenceExpression();
pre.UserData["AST"] = p;
pre.PropertyName = id;
pre.TargetObject = t0;
e = pre;
} else {
throw new Unsupported("unhandled sym type in expr_access");
}
return e;
} // emit_expr_access
private static CodeExpression emit_pointer_access(pointer_access p) {
throw new Unsupported("pointer access not handled");
} // emit_pointer_access
private static CodeExpression emit_predefined_access(predefined_access p) {
throw new Unsupported("predefined access not handled");
} // emit_predefined_access
private static CodeExpression emit_invocation_expression(invocation_expression p) {
CodeExpression e = null;
if (p.method != null) {
CodeExpression target = null;
if (p.method.IsInstance) {
target = emit_expression(p.expr);
}
CodeExpressionCollection ec;
if (p.expr.typ is DelegateType) {
CodeDelegateInvokeExpression die = new CodeDelegateInvokeExpression();
die.UserData["AST"] = p;
die.TargetObject = target;
ec = die.Parameters;
e = die;
} else {
CodeMethodReferenceExpression mre = new CodeMethodReferenceExpression();
mre.UserData["AST"] = p;
mre.TargetObject = target;
mre.MethodName = p.method.id.str;
CodeMethodInvokeExpression mie = new CodeMethodInvokeExpression();
mie.UserData["AST"] = p;
mie.Method = mre;
ec = mie.Parameters;
e = mie;
}
emit_argumentList(p.args, ec);
}
return e;
} // emit_invocation_expression
private static CodeExpression emit_element_access(element_access p) {
CodeExpression t0 = emit_expression(p.expr);
if (p.expr.typ is ArrayType) {
CodeArrayIndexerExpression aie = new CodeArrayIndexerExpression();
aie.UserData["AST"] = p;
aie.TargetObject = t0;
emit_argumentList(p.exprs, aie.Indices);
return aie;
} else {
CodeIndexerExpression aie = new CodeIndexerExpression();
aie.UserData["AST"] = p;
aie.TargetObject = t0;
emit_argumentList(p.exprs, aie.Indices);
return aie;
}
} // emit_element_access
private static void emit_argumentList(argumentList aList, CodeExpressionCollection ec) {
foreach (argument k in aList) {
CodeExpression s = emit_argument(k);
ec.Add(s);
}
}
private static CodeThisReferenceExpression emit_this_access(this_access p) {
CodeThisReferenceExpression tre = new CodeThisReferenceExpression();
tre.UserData["AST"] = p;
return tre;
} // emit_this_access
private static CodeBaseReferenceExpression emit_base_access(base_access p) {
CodeBaseReferenceExpression bre = new CodeBaseReferenceExpression();
bre.UserData["AST"] = p;
return bre;
} // emit_base_access
private static CodeExpression emit_post_expression(post_expression p) {
throw new Unsupported("post expression not handled");
} // emit_post_expression
private static CodeExpression emit_new_expression(new_expression p) {
CodeTypeReference t0 = emit_type(p.ty);
CodeExpression e;
if (p.typ is DelegateType) {
CodeDelegateCreateExpression dce = new CodeDelegateCreateExpression();
dce.UserData["AST"] = p;
dce.DelegateType = t0;
argument a = p.args[0];
if (a.expr is expr_access) {
expr_access ea = (expr_access) a.expr;
CodeExpression o = emit_expression(ea.expr);
dce.TargetObject = o;
dce.MethodName = ea.id.str;
e = dce;
} else {
throw new Unsupported("unknown expr in new_expression: " + a.expr.ToString());
}
} else if (p.typ is ClassType || p.typ is StructType) {
CodeObjectCreateExpression oce = new CodeObjectCreateExpression();
oce.UserData["AST"] = p;
oce.CreateType = t0;
emit_argumentList(p.args, oce.Parameters);
e = oce;
} else {
throw new Unsupported("unknown type in new_expression: " + p.typ.ToString());
}
return e;
} // emit_new_expression
private static CodeExpression emit_array_creation_expression1(array_creation_expression1 p) {
if (p.exprs.Count > 1) {
throw new Unsupported("cannot handle multi-dimension arrays");
}
if (p.ranks.Count > 0) {
throw new Unsupported("cannot handle high-rank arrays");
}
CodeArrayCreateExpression ace = new CodeArrayCreateExpression();
ace.UserData["AST"] = p;
CodeTypeReference t0 = emit_type(p.ty);
ace.CreateType = t0;
if (p.init != null) {
emit_array_initializer(p.init, ace.Initializers);
} else {
CodeExpression expr = emit_expression(p.exprs[0]);
ace.SizeExpression = expr;
}
return ace;
} // emit_array_creation_expression1
private static CodeArrayCreateExpression emit_array_creation_expression2(array_creation_expression2 p) {
CodeArrayCreateExpression ace = new CodeArrayCreateExpression();
ace.UserData["AST"] = p;
CodeTypeReference t0 = emit_type(p.ty);
ace.CreateType = t0;
emit_array_initializer(p.init, ace.Initializers);
return ace;
} // emit_array_creation_expression2
private static CodeExpression emit_typeof_expression(typeof_expression p) {
CodeTypeOfExpression toe = new CodeTypeOfExpression();
toe.UserData["AST"] = p;
CodeTypeReference t0 = emit_type(p.ty);
toe.Type = t0;
return toe;
} // emit_typeof_expression
private static CodeExpression emit_checked_expression(checked_expression p) {
throw new Unsupported("unhandled checked expression");
} // emit_checked_expression
private static CodeExpression emit_unchecked_expression(unchecked_expression p) {
throw new Unsupported("unhandled unchecked expression");
} // emit_unchecked_expression
private static CodeExpression emit_unary_expression(unary_expression p) {
throw new Unsupported("unhandled unary expression");
} // emit_unary_expression
private static CodeExpression emit_pre_expression(pre_expression p) {
throw new Unsupported("unhandled prefix expression");
} // emit_pre_expression
private static CodeCastExpression emit_cast_expression(cast_expression p) {
CodeCastExpression ce = new CodeCastExpression();
ce.UserData["AST"] = p;
CodeTypeReference t0 = emit_type(p.ty);
ce.TargetType = t0;
CodeExpression t1 = emit_expression(p.expr);
ce.Expression = t1;
return ce;
} // emit_cast_expression
private static CodeExpression emit_implicit_cast_expression(implicit_cast_expression p) {
throw new Unsupported("unhandled implicit cast expression");
}
private static CodeExpression emit_binary_expression(binary_expression p) {
CodeBinaryOperatorExpression boe = new CodeBinaryOperatorExpression();
boe.UserData["AST"] = p;
CodeExpression t0 = emit_expression(p.e1);
boe.Left = t0;
CodeBinaryOperatorType op;
switch (p.op.tag) {
case "+": op = CodeBinaryOperatorType.Add; break;
case "=": op = CodeBinaryOperatorType.Assign; break;
case "&": op = CodeBinaryOperatorType.BitwiseAnd; break;
case "|": op = CodeBinaryOperatorType.BitwiseOr; break;
case "&&": op = CodeBinaryOperatorType.BooleanAnd; break;
case "||": op = CodeBinaryOperatorType.BooleanOr; break;
case "/": op = CodeBinaryOperatorType.Divide; break;
case ">": op = CodeBinaryOperatorType.GreaterThan; break;
case ">=": op = CodeBinaryOperatorType.GreaterThanOrEqual; break;
case "==": op = CodeBinaryOperatorType.IdentityEquality; break;
case "!=": op = CodeBinaryOperatorType.IdentityInequality; break;
case "<": op = CodeBinaryOperatorType.LessThan; break;
case "<=": op = CodeBinaryOperatorType.LessThanOrEqual; break;
case "%": op = CodeBinaryOperatorType.Modulus; break;
case "*": op = CodeBinaryOperatorType.Multiply; break;
case "-": op = CodeBinaryOperatorType.Subtract; break;
default:
throw new Unsupported("unhandled binary operator " + p.op.str);
}
boe.Operator = op;
if (p.op.tag == "==") {
// WARNING: Could be CodeBinaryOperatorType.ValueEquality
}
CodeExpression t2 = emit_expression(p.e2);
boe.Right = t2;
return boe;
} // emit_binary_expression
private static CodeExpression emit_is_expression(is_expression p) {
throw new Unsupported("unhandled 'is' expression");
} // emit_is_expression
private static CodeExpression emit_as_expression(as_expression p) {
throw new Unsupported("unhandled 'as' expression");
} // emit_as_expression
private static CodeExpression emit_cond_expression(cond_expression p) {
throw new Unsupported("unhandled cond expression");
} // emit_cond_expression
private static CodeExpression emit_compound_assignment_expression(compound_assignment_expression p) {
throw new Unsupported("unhandled compound_assignment as expression");
}
private static CodeStatement emit_compound_assignment_statement(compound_assignment_expression p) {
if (!(p.typ is DelegateType)) {
throw new Unsupported("unhandled compound assignment expression " + p.op.str);
}
CodeEventReferenceExpression eventRef = (CodeEventReferenceExpression) emit_expression(p.e1);
eventRef.UserData["AST"] = p;
CodeExpression listener = emit_expression(p.e2);
if (p.op.str[0] == '+') {
CodeAttachEventStatement aes = new CodeAttachEventStatement(eventRef, listener);
aes.UserData["AST"] = p;
return aes;
} else if (p.op.str[0] == '-') {
CodeRemoveEventStatement res = new CodeRemoveEventStatement(eventRef, listener);
res.UserData["AST"] = p;
return res;
} else {
throw new Unsupported("unknown op: " + p.op.str);
}
} // emit_compound_assignment_expression
private static CodeExpression emit_assignment_expression(assignment_expression p) {
throw new Unsupported("unhandled: assignments as expressions");
}
private static CodeStatement emit_assignment_statement(assignment_expression p) {
CodeAssignStatement a = new CodeAssignStatement();
a.UserData["AST"] = p;
CodeExpression t0 = emit_expression(p.e1);
a.Left = t0;
CodeExpression t2 = emit_expression(p.e2);
a.Right = t2;
return a;
} // emit_assignment_expression
private static void emit_statement(statement p, CodeStatementCollection sc) {
sc.Add(emit_statement(p));
}
private static CodeStatement emit_statement(statement p) {
try {
return emit_statement0(p);
} catch (Unsupported u) {
CodeStatement s = new CodeCommentStatement("CodeDom Error: " + u.Message);
s.UserData["AST"] = p;
return s;
}
}
private static CodeStatement emit_statement0(statement p) {
if (p is expression_statement)
return emit_expression_statement((expression_statement) p);
if (p is block_statement)
return emit_block_statement((block_statement) p);
if (p is empty_statement)
return emit_empty_statement((empty_statement) p);
if (p is labeled_statement)
return emit_labeled_statement((labeled_statement) p);
if (p is local_statement)
return emit_local_statement((local_statement) p);
if (p is const_statement)
return emit_const_statement((const_statement) p);
if (p is if_statement)
return emit_if_statement((if_statement) p);
if (p is switch_statement)
return emit_switch_statement((switch_statement) p);
if (p is while_statement)
return emit_while_statement((while_statement) p);
if (p is do_statement)
return emit_do_statement((do_statement) p);
if (p is for_statement)
return emit_for_statement((for_statement) p);
if (p is foreach_statement)
return emit_foreach_statement((foreach_statement) p);
if (p is break_statement)
return emit_break_statement((break_statement) p);
if (p is continue_statement)
return emit_continue_statement((continue_statement) p);
if (p is goto_default_statement)
return emit_goto_default_statement((goto_default_statement) p);
if (p is goto_statement)
return emit_goto_statement((goto_statement) p);
if (p is goto_case_statement)
return emit_goto_case_statement((goto_case_statement) p);
if (p is return_statement)
return emit_return_statement((return_statement) p);
if (p is throw_statement)
return emit_throw_statement((throw_statement) p);
if (p is try_statement)
return emit_try_statement((try_statement) p);
if (p is checked_statement)
return emit_checked_statement((checked_statement) p);
if (p is unchecked_statement)
return emit_unchecked_statement((unchecked_statement) p);
if (p is lock_statement)
return emit_lock_statement((lock_statement) p);
if (p is using_statement)
return emit_using_statement((using_statement) p);
if (p is fixed_statement)
return emit_fixed_statement((fixed_statement) p);
throw new Unsupported(p.ToString());
} // emit_statement
private static CodeStatement emit_block_statement(block_statement p) {
throw new Unsupported("unhandled block statement");
} // emit_block_statement
private static void emit_block_statement(block_statement p, CodeStatementCollection sc) {
foreach (statement k in p.stmts) {
emit_statement(k, sc);
}
} // emit_block_statement
private static CodeStatement emit_empty_statement(empty_statement p) {
CodeCommentStatement cs = new CodeCommentStatement("empty statement");
cs.UserData["AST"] = p;
return cs;
} // emit_empty_statement
private static CodeLabeledStatement emit_labeled_statement(labeled_statement p) {
CodeLabeledStatement ls = new CodeLabeledStatement();
ls.UserData["AST"] = p;
ls.Label = p.label.str;
CodeStatement t1 = emit_statement0(p.stmt);
ls.Statement = t1;
return ls;
} // emit_labeled_statement
private static CodeStatement emit_local_statement(local_statement p) {
if (p.vars.Count > 1) {
throw new Unsupported("cannot handle multiple declarations");
}
CodeTypeReference t2 = emit_type(p.ty);
var_declarator k = (var_declarator)p.vars[0];
CodeVariableDeclarationStatement vds = new CodeVariableDeclarationStatement();
vds.UserData["AST"] = p;
vds.Type = t2;
vds.Name = k.id.str;
if (k.init != null) {
CodeExpression t4 = emit_variable_initializer(k.init);
vds.InitExpression = t4;
}
return vds;
} // emit_local_statement
private static CodeStatement emit_var_decl(var_declarator p) {
throw new Unsupported("unhandled var_declarator");
} // emit_var_decl
private static CodeStatement emit_const_statement(const_statement p) {
throw new Unsupported("unhandled const_statement");
} // emit_const_statement
private static CodeStatement emit_const_decl(const_declarator p) {
throw new Unsupported("unhandled const_declarator expression");
} // emit_const_decl
private static CodeConditionStatement emit_if_statement(if_statement p) {
CodeConditionStatement cs = new CodeConditionStatement();
cs.UserData["AST"] = p;
CodeExpression t0 = emit_expression(p.expr);
cs.Condition = t0;
emit_statement(p.thenpart, cs.TrueStatements);
if (p.elsepart != null) {
emit_statement(p.elsepart, cs.FalseStatements);
}
return cs;
} // emit_if_statement
private static CodeStatement emit_switch_statement(switch_statement p) {
throw new Unsupported("unhandled switch statement");
} // emit_switch_statement
private static CodeStatement emit_switch_section(switch_section p) {
throw new Unsupported("unhandled switch_section");
} // emit_switch_section
private static CodeObject emit_switch_label(switch_label p) {
if (p is switch_expression)
return emit_switch_expression((switch_expression) p);
if (p is switch_default)
return emit_switch_default((switch_default) p);
throw new Unsupported(p.ToString());
} // emit_switch_label
private static CodeObject emit_switch_expression(switch_expression p) {
throw new Unsupported("unhandled switch expression");
} // emit_switch_expression
private static CodeObject emit_switch_default(switch_default p) {
throw new Unsupported("unhandled switch default");
} // emit_switch_default
private static CodeIterationStatement emit_while_statement(while_statement p) {
CodeIterationStatement iter = new CodeIterationStatement();
iter.UserData["AST"] = p;
iter.TestExpression = emit_expression(p.expr);
emit_statement(p.body, iter.Statements);
return iter;
} // emit_while_statement
private static CodeIterationStatement emit_do_statement(do_statement p) {
throw new Unsupported("unhandled 'do' loop statement");
} // emit_do_statement
private static CodeIterationStatement emit_for_statement(for_statement p) {
throw new Unsupported("unhandled 'for' loop");
} // emit_for_statement
private static CodeObject emit_for_init(for_init p) {
if (p is for_decl)
return emit_for_decl((for_decl) p);
if (p is for_list)
return emit_for_list((for_list) p);
throw new Unsupported(p.ToString());
} // emit_for_init
private static CodeObject emit_for_decl(for_decl p) {
throw new Unsupported("unhandled 'for' decl");
} // emit_for_decl
private static CodeObject emit_for_list(for_list p) {
throw new Unsupported("unhandled 'for' list");
} // emit_for_list
private static CodeStatement emit_foreach_statement(foreach_statement p) {
throw new Unsupported("unhandled 'foreach' loop");
} // emit_foreach_statement
private static CodeStatement emit_break_statement(break_statement p) {
throw new Unsupported("unhandled break statement");
} // emit_break_statement
private static CodeStatement emit_continue_statement(continue_statement p) {
throw new Unsupported("unhandled continue statement");
} // emit_continue_statement
private static CodeStatement emit_goto_default_statement(goto_default_statement p) {
throw new Unsupported("unhandled goto default");
} // emit_goto_default_statement
private static CodeGotoStatement emit_goto_statement(goto_statement p) {
return new CodeGotoStatement(p.id.str);
} // emit_goto_statement
private static CodeStatement emit_goto_case_statement(goto_case_statement p) {
throw new Unsupported("unhandled goto case");
} // emit_goto_case_statement
private static CodeMethodReturnStatement emit_return_statement(return_statement p) {
CodeMethodReturnStatement mrs = new CodeMethodReturnStatement();
mrs.UserData["AST"] = p;
if (p.expr != null) {
mrs.Expression = emit_expression(p.expr);
}
return mrs;
} // emit_return_statement
private static CodeThrowExceptionStatement emit_throw_statement(throw_statement p) {
CodeThrowExceptionStatement tes = new CodeThrowExceptionStatement();
tes.UserData["AST"] = p;
tes.ToThrow = emit_expression(p.expr);
return tes;
} // emit_throw_statement
private static CodeTryCatchFinallyStatement emit_try_statement(try_statement p) {
CodeTryCatchFinallyStatement tcfs = new CodeTryCatchFinallyStatement();
tcfs.UserData["AST"] = p;
emit_block_statement((block_statement)p.block, tcfs.TryStatements);
if (p.catches != null) {
CodeCatchClauseCollection ccc = emit_catch_clauses(p.catches);
tcfs.CatchClauses.AddRange(ccc);
}
if (p.finally_block != null) {
emit_block_statement((block_statement)p.finally_block.block, tcfs.FinallyStatements);
}
return tcfs;
} // emit_try_statement
private static CodeCatchClause emit_catch_clause(catch_clause p) {
return emit_specific_catch_clause(p);
} // emit_catch_clause
private static CodeCatchClause emit_specific_catch_clause(catch_clause p) {
CodeCatchClause cc = new CodeCatchClause(); // Why doesn't this have UserData["AST"]????
cc.CatchExceptionType = emit_type(p.ty);
if (p.id != null) {
cc.LocalName = p.id.str;
}
emit_block_statement((block_statement) p.block, cc.Statements);
return cc;
} // emit_specific_catch_clause
private static CodeCatchClause emit_general_catch_clause(statement p) {
CodeCatchClause cc = new CodeCatchClause();
emit_statement(p, cc.Statements);
return cc;
} // emit_general_catch_clause
private static CodeCatchClauseCollection emit_catch_clauses(catch_clauses p) {
CodeCatchClauseCollection ccc = new CodeCatchClauseCollection();
foreach (catch_clause k in p.specifics) {
CodeCatchClause s = emit_catch_clause(k);
ccc.Add(s);
}
if (p.general != null) {
CodeCatchClause t1 = emit_general_catch_clause(p.general);
ccc.Add(t1);
}
return ccc;
} // emit_catch_clauses
private static CodeStatement emit_checked_statement(checked_statement p) {
throw new Unsupported("unhandled checked statement");
} // emit_checked_statement
private static CodeStatement emit_unchecked_statement(unchecked_statement p) {
throw new Unsupported("unhandled unchecked statement");
} // emit_unchecked_statement
private static CodeStatement emit_lock_statement(lock_statement p) {
throw new Unsupported("unhandled lock statement");
} // emit_lock_statement
private static CodeStatement emit_using_statement(using_statement p) {
throw new Unsupported("unhandled using statement");
} // emit_using_statement
private static CodeObject emit_resource(resource p) {
if (p is resource_expr)
return emit_resource_expr((resource_expr) p);
if (p is resource_decl)
return emit_resource_decl((resource_decl) p);
throw new Unsupported(p.ToString());
} // emit_resource
private static CodeExpression emit_resource_expr(resource_expr p) {
throw new Unsupported("unhandled 'resource expression");
} // emit_resource_expr
private static CodeExpression emit_resource_decl(resource_decl p) {
throw new Unsupported("unhandled resource decl");
} // emit_resource_decl
private static CodeTypeMember emit_declaration(declaration p) {
if (p is constant_declaration)
return emit_constant_declaration((constant_declaration) p);
if (p is field_declaration)
return emit_field_declaration((field_declaration) p);
if (p is method_declaration)
return emit_method_declaration((method_declaration) p);
if (p is property_declaration)
return emit_property_declaration((property_declaration) p);
if (p is event_declaration1)
return emit_event_declaration1((event_declaration1) p);
if (p is event_declaration2)
return emit_event_declaration2((event_declaration2) p);
if (p is indexer_declaration)
return emit_indexer_declaration((indexer_declaration) p);
if (p is operator_declaration)
return emit_operator_declaration((operator_declaration) p);
if (p is constructor_declaration)
return emit_constructor_declaration((constructor_declaration) p);
if (p is destructor_declaration)
return emit_destructor_declaration((destructor_declaration) p);
if (p is struct_declaration)
return emit_struct_declaration((struct_declaration) p);
if (p is interface_declaration)
return emit_interface_declaration((interface_declaration) p);
if (p is interface_method_declaration)
return emit_interface_method_declaration((interface_method_declaration) p);
if (p is interface_property_declaration)
return emit_interface_property_declaration((interface_property_declaration) p);
if (p is interface_event_declaration)
return emit_interface_event_declaration((interface_event_declaration) p);
if (p is interface_indexer_declaration)
return emit_interface_indexer_declaration((interface_indexer_declaration) p);
if (p is enum_declaration)
return emit_enum_declaration((enum_declaration) p);
if (p is class_declaration)
return emit_class_declaration((class_declaration) p);
if (p is delegate_declaration)
return emit_delegate_declaration((delegate_declaration) p);
throw new Unsupported(p.ToString());
} // emit_declaration
private static CodeNamespace emit_namespace_declaration(namespace_declaration p) {
CodeNamespace n = new CodeNamespace();
n.UserData["AST"] = p;
string t0 = dotted2string(p.id);
n.Name = t0;
emit_namespace_body(p.nb, n);
return n;
} // emit_namespace_declaration
private static void emit_namespace_body(namespace_body p, CodeNamespace n) {
foreach (using_directive k in p.ud) {
CodeNamespaceImport s = emit_using_directive(k);
n.Imports.Add(s);
}
foreach (declaration k in p.declarations) {
if (k is namespace_declaration) {
throw new Unsupported("nested namespace declarations unallowed");
} else {
CodeTypeDeclaration s = (CodeTypeDeclaration) emit_declaration(k);
n.Types.Add(s);
}
}
} // emit_namespace_body
private static CodeNamespaceImport emit_using_directive(using_directive p) {
if (p is alias_directive)
return emit_alias_directive((alias_directive) p);
if (p is namespace_directive)
return emit_namespace_directive((namespace_directive) p);
throw new Unsupported(p.ToString());
} // emit_using_directive
private static CodeNamespaceImport emit_alias_directive(alias_directive p) {
throw new Unsupported("\t// ERROR: CodeDOM does not support: \"using A=B;\"\n");
} // emit_alias_directive
private static CodeNamespaceImport emit_namespace_directive(namespace_directive p) {
CodeNamespaceImport ni = new CodeNamespaceImport();
ni.UserData["AST"] = p;
string t0 = dotted2string(p.name);
ni.Namespace = t0;
return ni;
} // emit_namespace_directive
private static CodeTypeDeclaration emit_constant_declaration(constant_declaration p) {
throw new Unsupported("unhandled const declaration");
} // emit_constant_declaration
private static CodeMemberField emit_field_declaration(field_declaration p) {
if (p.decls.Count > 1) {
throw new Unsupported("cannot handle compound field declarations");
}
System.Collections.Queue t3 = new System.Collections.Queue();
field_declarator k = (field_declarator) p.decls[0];
CodeMemberField mf = new CodeMemberField();
mf.UserData["AST"] = p;
mf.CustomAttributes = emit_attribute_sections(p.attrs);
CodeTypeReference t2 = emit_type(p.ty);
mf.Type = t2;
mf.Name = k.id.str;
if (k.init != null) {
CodeExpression t4 = emit_variable_initializer(k.init);
mf.InitExpression = t4;
}
mf.Attributes = emit_CodeDomAttributes(p.mods);
return mf;
} // emit_field_declaration
private static CodeMemberMethod emit_method_declaration(method_declaration p) {
CodeMemberMethod mm = new CodeMemberMethod();
mm.UserData["AST"] = p;
mm.Attributes = emit_CodeDomAttributes(p.mods);
mm.CustomAttributes = emit_attribute_sections(p.attrs);
mm.ReturnType = emit_type(p.ty);
// WARNING: unimplemented Interface name: method_declaration.name
mm.Name = p.name.id.str;
mm.Parameters.AddRange(emit_formals(p.parms));
if (p.body != null) {
emit_block_statement((block_statement)p.body, mm.Statements);
} else {
// WARNING: unimplemented null check: method_declaration.body
}
return mm;
} // emit_method_declaration
private static CodeTypeReference emit_void_type(void_type p) {
CodeTypeReference tr = new CodeTypeReference(typeof(void));
tr.UserData["AST"] = p;
return tr;
} // emit_void_type
private static CodeParameterDeclarationExpressionCollection emit_formals(formals p) {
CodeParameterDeclarationExpressionCollection pdec = new CodeParameterDeclarationExpressionCollection();
foreach (parameter k in p.fixeds) {
CodeParameterDeclarationExpression s = emit_parameter(k);
pdec.Add(s);
}
if (p.param != null) {
CodeParameterDeclarationExpression s = emit_parameter(p.param);
pdec.Add(s);
}
return pdec;
} // emit_formals
private static CodeParameterDeclarationExpression emit_parameter(parameter p) {
if (p is fixed_parameter)
return emit_fixed_parameter((fixed_parameter) p);
if (p is params_parameter)
return emit_params_parameter((params_parameter) p);
if (p is arglist_parameter)
return emit_arglist_parameter((arglist_parameter) p);
throw new Unsupported(p.ToString());
} // emit_parameter
private static CodeParameterDeclarationExpression emit_fixed_parameter(fixed_parameter p) {
CodeParameterDeclarationExpression pde = new CodeParameterDeclarationExpression();
pde.UserData["AST"] = p;
pde.Name = p.id.str;
pde.CustomAttributes = emit_attribute_sections(p.attrs);
if (p.mod != null) {
switch (p.mod.str) {
case "ref": pde.Direction = FieldDirection.Ref; break;
case "out": pde.Direction = FieldDirection.Out; break;
default:
throw new Unsupported("unhandled modifier " + p.mod.str);
}
}
pde.Type = emit_type(p.ty);
return pde;
} // emit_fixed_parameter
private static CodeParameterDeclarationExpression emit_params_parameter(params_parameter p) {
throw new Unsupported("unhandled params declaration");
} // emit_params_parameter
private static CodeParameterDeclarationExpression emit_arglist_parameter(arglist_parameter p) {
throw new Unsupported("unhandled arglist declaration");
} // emit_arglist_parameter
private static CodeMemberProperty emit_property_declaration(property_declaration p) {
CodeMemberProperty mp = new CodeMemberProperty();
mp.UserData["AST"] = p;
mp.CustomAttributes = emit_attribute_sections(p.attrs); // need to fix this all over the place
mp.Attributes = emit_CodeDomAttributes(p.mods);
mp.Type = emit_type(p.ty);
mp.Name = get_member_name(p.name);
foreach (accessor_declaration k in p.decls) {
if (k != null) {
emit_accessor_declaration(k, mp);
}
}
return mp;
} // emit_property_declaration
private static void emit_accessor_declaration(accessor_declaration p, CodeMemberProperty mp) {
if (p.attrs.Count > 0) {
throw new Unsupported("cannot handle attributes");
}
switch (p.id.str) {
default:
throw new Unsupported("unknown accessor: " + p.id.str);
case "get":
mp.HasGet = true;
if (p.body != null) {
emit_block_statement((block_statement)p.body, mp.GetStatements);
}
break;
case "set":
mp.HasSet = true;
if (p.body != null) {
emit_block_statement((block_statement)p.body, mp.SetStatements);
}
break;
}
} // emit_accessor_declaration
private static string emit_event_declarator(event_declarator p) {
return p.id.str;
}
private static CodeMemberEvent emit_event_declaration1(event_declaration1 p) {
if (p.decls.Count > 1) {
// WARNING: cannot handle multiple comma-separated events
}
declarator d = p.decls[0];
CodeMemberEvent me = new CodeMemberEvent();
me.UserData["AST"] = p;
me.CustomAttributes = emit_attribute_sections(p.attrs);
me.Type = emit_type(p.ty);
me.Name = d.id.str;
me.Attributes = emit_CodeDomAttributes(p.mods);
return me;
} // emit_event_declaration1
private static CodeMemberEvent emit_event_declaration2(event_declaration2 p) {
if (p.accessors.Count > 0) {
throw new Unsupported("cannot handle event accessors");
}
CodeMemberEvent me = new CodeMemberEvent();
me.UserData["AST"] = p;
me.CustomAttributes = emit_attribute_sections(p.attrs);
me.Attributes = emit_CodeDomAttributes(p.mods);
me.Type = emit_type(p.ty);
me.Name = p.name.id.str;
// handle accessors here.
return me;
} // emit_event_declaration2
private static CodeObject emit_event_accessor(event_accessor p) {
throw new Unsupported("cannot handle event accessors");
} // emit_event_accessor
private static CodeTypeMember emit_indexer_declaration(indexer_declaration p) {
throw new Unsupported("unhandled indexer declaration");
} // emit_indexer_declaration
private static CodeObject emit_indexer(indexer p) {
throw new Unsupported("unhandled indexer");
} // emit_indexer
private static CodeTypeMember emit_operator_declaration(operator_declaration p) {
throw new Unsupported("unhandled operator declaration");
} // emit_operator_declaration
private static CodeTypeMember emit_operator_declarator(operator_declarator p) {
if (p is unary_declarator)
return emit_unary_declarator((unary_declarator) p);
if (p is binary_declarator)
return emit_binary_declarator((binary_declarator) p);
if (p is implicit_declarator)
return emit_implicit_declarator((implicit_declarator) p);
if (p is explicit_declarator)
return emit_explicit_declarator((explicit_declarator) p);
throw new Unsupported(p.ToString());
} // emit_operator_declarator
private static CodeTypeMember emit_unary_declarator(unary_declarator p) {
throw new Unsupported("unhandled unary declaration");
} // emit_unary_declarator
private static CodeTypeMember emit_binary_declarator(binary_declarator p) {
throw new Unsupported("unhandled binary declaration");
} // emit_binary_declarator
private static CodeTypeMember emit_implicit_declarator(implicit_declarator p) {
throw new Unsupported("unhandled implicit declaration");
} // emit_implicit_declarator
private static CodeTypeMember emit_explicit_declarator(explicit_declarator p) {
throw new Unsupported("unhandled explicit declaration");
} // emit_explicit_declarator
private static CodeMemberMethod emit_constructor_declaration(constructor_declaration p) {
CodeMemberMethod c;
if (p.sym.IsStatic) {
CodeTypeConstructor ctc = new CodeTypeConstructor();
ctc.UserData["AST"] = p;
c = ctc;
emit_constructor_declarator(p.decl, ctc);
} else {
CodeConstructor cc = new CodeConstructor();
cc.UserData["AST"] = p;
c = cc;
emit_constructor_declarator(p.decl, cc);
}
c.CustomAttributes = emit_attribute_sections(p.attrs);
c.Attributes = emit_CodeDomAttributes(p.mods);
if (p.block != null) {
emit_block_statement((block_statement)p.block, c.Statements);
} else {
// WARNING: unimplemented null check: constructor_declaration.block
}
return c;
} // emit_constructor_declaration
private static MemberAttributes emit_CodeDomAttributes(System.Collections.IList a) {
MemberAttributes ma = 0;
foreach (InputElement e in a) {
ma |= emit_CodeDomAttribute(e.tag);
}
return ma;
}
private static MemberAttributes emit_CodeDomAttribute(string modifier) {
switch (modifier) {
case "public": return MemberAttributes.Public;
case "abstract": return MemberAttributes.Abstract;
case "final": return MemberAttributes.Final;
case "override": return MemberAttributes.Override;
case "private": return MemberAttributes.Private;
case "static": return MemberAttributes.Static;
default:
throw new Unsupported("unhandled non-CodeDOM modifier: " + modifier);
}
}
private static void emit_constructor_declarator(constructor_declarator p, CodeTypeConstructor c) {
c.Name = p.id.str;
c.Parameters.AddRange(emit_formals(p.f));
// assert(p.init == null)
} // emit_constructor_declarator
private static void emit_constructor_declarator(constructor_declarator p, CodeConstructor c) {
c.Name = p.id.str;
c.Parameters.AddRange(emit_formals(p.f));
if (p.init != null) {
emit_constructor_initializer(p.init, c);
}
} // emit_constructor_declarator
private static void emit_constructor_initializer(constructor_initializer p, CodeConstructor c) {
if (p is base_initializer) {
emit_base_initializer((base_initializer) p, c);
return;
}
if (p is this_initializer) {
emit_this_initializer((this_initializer) p, c);
return;
}
throw new Unsupported(p.ToString());
} // emit_constructor_initializer
private static void emit_base_initializer(base_initializer p, CodeConstructor c) {
emit_argumentList(p.args, c.BaseConstructorArgs);
} // emit_base_initializer
private static void emit_this_initializer(this_initializer p, CodeConstructor c) {
emit_argumentList(p.args, c.ChainedConstructorArgs);
} // emit_this_initializer
private static CodeTypeMember emit_destructor_declaration(destructor_declaration p) {
throw new Unsupported("unhandled destructor declaration");
} // emit_destructor_declaration
private static CodeTypeDeclaration emit_struct_declaration(struct_declaration p) {
CodeTypeDeclaration td = new CodeTypeDeclaration();
td.UserData["AST"] = p;
td.IsStruct = true;
td.CustomAttributes = emit_attribute_sections(p.attrs);
td.Attributes = emit_CodeDomAttributes(p.mods);
td.Name = p.id.str;
foreach (type k in p.interfaces) {
td.BaseTypes.Add(emit_type(k));
}
foreach (declaration k in p.body) {
td.Members.Add(emit_declaration(k));
}
return td;
} // emit_struct_declaration
private static CodeTypeDeclaration emit_interface_declaration(interface_declaration p) {
CodeTypeDeclaration td = new CodeTypeDeclaration();
td.UserData["AST"] = p;
td.IsInterface = true;
td.CustomAttributes = emit_attribute_sections(p.attrs);
td.Attributes = emit_CodeDomAttributes(p.mods);
td.Name = p.id.str;
foreach (type k in p.interfaces) {
td.BaseTypes.Add(emit_type(k));
}
foreach (declaration k in p.body) {
td.Members.Add(emit_declaration(k));
}
return td;
} // emit_interface_declaration
private static CodeMemberMethod emit_interface_method_declaration(interface_method_declaration p) {
throw new Unsupported("unhandled interface method declaration");
} // emit_interface_method_declaration
private static CodeMemberProperty emit_interface_property_declaration(interface_property_declaration p) {
throw new Unsupported("unhandled interface property declaration");
} // emit_interface_property_declaration
private static CodeMemberEvent emit_interface_event_declaration(interface_event_declaration p) {
throw new Unsupported("unhandled interface event declaration");
} // emit_interface_event_declaration
private static CodeTypeMember emit_interface_indexer_declaration(interface_indexer_declaration p) {
throw new Unsupported("unhandled interface indexer declaration");
} // emit_interface_indexer_declaration
private static CodeTypeMember emit_enum_declaration(enum_declaration p) {
throw new Unsupported("unhandled interface enum declaration");
} // emit_enum_declaration
private static CodeTypeDeclaration emit_class_declaration(class_declaration p) {
CodeTypeDeclaration td = new CodeTypeDeclaration();
td.UserData["AST"] = p;
td.IsClass = true;
td.CustomAttributes.AddRange(emit_attribute_sections(p.attrs));
td.Attributes = emit_CodeDomAttributes(p.mods);
td.Name = p.id.str;
foreach (type k in p.bases) {
td.BaseTypes.Add(emit_type(k));
}
foreach (declaration k in p.body) {
td.Members.Add(emit_declaration(k));
}
return td;
} // emit_class_declaration
private static CodeTypeMember emit_enum_member_declaration(enum_member_declaration p) {
throw new Unsupported("unhandled enum member declaration");
} // emit_enum_member_declaration
private static CodeTypeDelegate emit_delegate_declaration(delegate_declaration p) {
CodeTypeDelegate td = new CodeTypeDelegate();
td.UserData["AST"] = p;
td.CustomAttributes.AddRange(emit_attribute_sections(p.attrs));
td.Attributes = emit_CodeDomAttributes(p.mods);
td.ReturnType = emit_type(p.ty);
td.Name = p.id.str;
td.Parameters.AddRange(emit_formals(p.f));
return td;
} // emit_delegate_declaration
private static CodeAttributeDeclarationCollection emit_attribute_section(attribute_section p) {
CodeAttributeDeclarationCollection adc = new CodeAttributeDeclarationCollection();
if (p.target != null) {
// WARNING: unimplemented target: attribute_section.target
} else {
// WARNING: unimplemented null check: attribute_section.target
}
foreach (attribute k in p.attributes) {
adc.Add(emit_attribute(k));
}
return adc;
} // emit_attribute_section
private static CodeAttributeDeclaration emit_attribute(attribute p) {
CodeAttributeDeclaration ad = new CodeAttributeDeclaration(); // Why doesn't CodeAttributeDeclaration have UserData["AST"]?
CodeTypeReference t0 = emit_type(p.name);
ad.Name = t0.BaseType; // WARNING: Is this correct?
foreach (expression k in p.arguments.args) {
CodeAttributeArgument aa = new CodeAttributeArgument(); // UserData["AST"]?
aa.Value = emit_expression(k);
ad.Arguments.Add(aa);
}
// p.arguments.namedargs
foreach (named_argument s in p.arguments.namedargs) {
CodeAttributeArgument aa = emit_named_argument(s);
ad.Arguments.Add(aa);
}
return ad;
} // emit_attribute
private static CodeAttributeArgument emit_named_argument(named_argument p) {
CodeAttributeArgument aa = new CodeAttributeArgument(); // UserData["AST"]?
aa.Value = emit_expression(p.expr);
aa.Name = p.id.str;
return aa;
}
private static CodeTypeReference emit_pointer_type(pointer_type p) {
throw new Unsupported("unhandled pointer type");
} // emit_pointer_type
private static CodeTypeReference emit_void_pointer_type(void_pointer_type p) {
throw new Unsupported("unhandled void pointer type");
} // emit_void_pointer_type
private static CodeExpression emit_sizeof_expression(sizeof_expression p) {
throw new Unsupported("unhandled sizeof expression");
} // emit_sizeof_expression
private static CodeStatement emit_fixed_statement(fixed_statement p) {
throw new Unsupported("unhandled fixed statement");
} // emit_fixed_statement
private static string emit_fixed_declarator(fixed_declarator p) {
throw new Unsupported("unhandled fixed declarator");
} // emit_fixed_declarator
private static CodeExpression emit_stackalloc_initializer(stackalloc_initializer p) {
throw new Unsupported("unhandled stackalloc initializer");
} // emit_stackalloc_initializer
private static CodeExpression emit_variable_initializer(variable_initializer p) {
if (p is stackalloc_initializer)
return emit_stackalloc_initializer((stackalloc_initializer) p);
if (p is expr_initializer)
return emit_expr_initializer((expr_initializer) p);
if (p is array_initializer)
throw new Unsupported("should be handled elsewhere");
//return emit_array_initializer((array_initializer) p);
throw new Unsupported(p.ToString());
} // emit_variable_initializer
private static CodeExpression emit_expr_initializer(expr_initializer p) {
return emit_expression(p.expr);
} // emit_expr_initializer
private static void emit_array_initializer(array_initializer p, CodeExpressionCollection ec) {
foreach (variable_initializer k in p.a) {
CodeExpression s = emit_variable_initializer(k);
ec.Add(s);
}
} // emit_array_initializer
} // class AST2CodeDom