1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
6
using ICSharpCode.NRefactory.Ast;
7
using B = Boo.Lang.Compiler.Ast;
9
namespace NRefactoryToBooConverter
11
partial class ConvertVisitor
13
public object VisitCompilationUnit(CompilationUnit compilationUnit, object data)
15
module = new B.Module();
16
module.LexicalInfo = new B.LexicalInfo(fileName, 1, 1);
17
compilationUnit.AcceptChildren(this, data);
18
if (entryPointMethod != null) {
19
bool allMembersAreStatic = true;
20
foreach (B.TypeMember member in entryPointMethod.DeclaringType.Members) {
21
allMembersAreStatic &= member.IsStatic;
23
if (allMembersAreStatic) {
24
entryPointMethod.DeclaringType.Attributes.Add(MakeAttribute(("module")));
26
lastLexicalInfo = entryPointMethod.LexicalInfo;
27
B.Expression expr = MakeReferenceExpression(entryPointMethod.DeclaringType.Name + ".Main");
28
B.MethodInvocationExpression mie = new B.MethodInvocationExpression(lastLexicalInfo, expr);
29
if (entryPointMethod.Parameters.Count > 0) {
30
mie.Arguments.Add(MakeReferenceExpression("argv"));
32
B.SimpleTypeReference ret = entryPointMethod.ReturnType as B.SimpleTypeReference;
33
if (ret.Name == "void" || ret.Name == "System.Void")
34
module.Globals.Add(new B.ExpressionStatement(mie));
36
module.Globals.Add(new B.ReturnStatement(lastLexicalInfo, mie, null));
39
B.Module tmp = module;
44
public object VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration, object data)
46
if (module.Namespace != null) {
47
AddError(namespaceDeclaration, "Only one namespace declaration per file is supported.");
50
module.Namespace = new B.NamespaceDeclaration(GetLexicalInfo(namespaceDeclaration));
51
module.Namespace.Name = namespaceDeclaration.Name;
52
return namespaceDeclaration.AcceptChildren(this, data);
55
public object VisitUsingDeclaration(UsingDeclaration usingDeclaration, object data)
57
foreach (Using u in usingDeclaration.Usings) {
63
public object VisitUsing(Using @using, object data)
67
import = new B.Import(@using.Alias.Type, null, new B.ReferenceExpression(@using.Name));
68
import.LexicalInfo = GetLexicalInfo(@using);
70
import = new B.Import(GetLexicalInfo(@using), @using.Name);
72
module.Imports.Add(import);
76
B.TypeDefinition currentType;
78
public object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data)
80
if (typeDeclaration.Templates.Count > 0) {
81
AddError(typeDeclaration, "Generic type definitions are not supported.");
83
B.TypeDefinition oldType = currentType;
84
B.TypeDefinition typeDef;
85
switch (typeDeclaration.Type) {
87
typeDef = new B.ClassDefinition(GetLexicalInfo(typeDeclaration));
89
case ClassType.Interface:
90
typeDef = new B.InterfaceDefinition(GetLexicalInfo(typeDeclaration));
93
typeDef = new B.EnumDefinition(GetLexicalInfo(typeDeclaration));
95
case ClassType.Struct:
96
typeDef = new B.StructDefinition(GetLexicalInfo(typeDeclaration));
98
case ClassType.Module:
99
typeDef = new B.ClassDefinition(GetLexicalInfo(typeDeclaration));
100
typeDeclaration.Modifier |= Modifiers.Static;
103
AddError(typeDeclaration, "Unknown class type.");
106
if (currentType != null)
107
typeDef.Modifiers = ConvertModifier(typeDeclaration, B.TypeMemberModifiers.Private);
109
typeDef.Modifiers = ConvertModifier(typeDeclaration, B.TypeMemberModifiers.Internal);
110
typeDef.Name = typeDeclaration.Name;
111
typeDef.EndSourceLocation = GetLocation(typeDeclaration.EndLocation);
112
ConvertAttributes(typeDeclaration.Attributes, typeDef.Attributes);
113
ConvertTypeReferences(typeDeclaration.BaseTypes, typeDef.BaseTypes);
115
if (currentType != null)
116
currentType.Members.Add(typeDef);
118
module.Members.Add(typeDef);
119
currentType = typeDef;
120
typeDeclaration.AcceptChildren(this, data);
121
currentType = oldType;
125
public object VisitDelegateDeclaration(DelegateDeclaration delegateDeclaration, object data)
127
B.CallableDefinition cd = new B.CallableDefinition(GetLexicalInfo(delegateDeclaration));
128
cd.Name = delegateDeclaration.Name;
129
ConvertAttributes(delegateDeclaration.Attributes, cd.Attributes);
130
cd.Modifiers = ConvertModifier(delegateDeclaration, B.TypeMemberModifiers.Private);
131
ConvertParameters(delegateDeclaration.Parameters, cd.Parameters);
132
cd.ReturnType = ConvertTypeReference(delegateDeclaration.ReturnType);
133
if (currentType != null)
134
currentType.Members.Add(cd);
136
module.Members.Add(cd);
140
void ConvertAttributes(List<AttributeSection> sections, B.AttributeCollection col)
142
foreach (AttributeSection s in sections) {
143
if (s.AttributeTarget.Length > 0) {
144
AddError(s, "Attribute target not supported");
147
foreach (ICSharpCode.NRefactory.Ast.Attribute a in s.Attributes) {
148
col.Add((B.Attribute)VisitAttribute(a, null));
153
public object VisitAttribute(ICSharpCode.NRefactory.Ast.Attribute a, object data)
155
B.Attribute att = new B.Attribute(GetLexicalInfo(a), a.Name);
156
att.EndSourceLocation = GetLocation(a.EndLocation);
157
ConvertExpressions(a.PositionalArguments, att.Arguments);
158
foreach (NamedArgumentExpression nae in a.NamedArguments) {
159
B.Expression expr = ConvertExpression(nae.Expression);
161
att.NamedArguments.Add(new B.ExpressionPair(new B.ReferenceExpression(nae.Name), expr));
167
public object VisitAttributeSection(AttributeSection s, object data)
169
if (s.AttributeTarget.Equals("assembly", StringComparison.OrdinalIgnoreCase)) {
170
foreach (ICSharpCode.NRefactory.Ast.Attribute a in s.Attributes) {
171
module.AssemblyAttributes.Add((B.Attribute)VisitAttribute(a, null));
174
AddError(s, "Attribute must have the target 'assembly'");
179
// Some classes are handled by their parent (TemplateDefinition by TypeDeclaration/MethodDeclaration etc.)
180
// so we don't need to implement Visit for them.
181
public object VisitTemplateDefinition(TemplateDefinition templateDefinition, object data)
183
throw new ApplicationException("Visited TemplateDefinition.");
186
public object VisitInterfaceImplementation(InterfaceImplementation interfaceImplementation, object data)
188
throw new ApplicationException("Visited InterfaceImplementation.");
191
public object VisitOptionDeclaration(OptionDeclaration optionDeclaration, object data)
193
AddError(optionDeclaration, "Option statement is not supported.");
197
public object VisitExternAliasDirective(ExternAliasDirective externAliasDirective, object data)
199
AddError(externAliasDirective, "'extern alias' directive is not supported.");