private DeclarationIL Build(IDeclaration declaration, ISymbolTree symbolTree) { if (declarationsIL.TryGetValue(declaration.Symbol, out var declarationIL)) { return(declarationIL); } switch (declaration) { default: throw ExhaustiveMatch.Failed(declaration); case IFunctionDeclaration function: { var il = ilFactory.CreateGraph(function); declarationIL = new FunctionIL(false, false, function.Symbol, BuildParameters(function.Parameters), il); break; } case IAssociatedFunctionDeclaration associatedFunction: { var il = ilFactory.CreateGraph(associatedFunction); declarationIL = new FunctionIL(false, true, associatedFunction.Symbol, BuildParameters(associatedFunction.Parameters), il); break; } case IConcreteMethodDeclaration method: { var il = ilFactory.CreateGraph(method); declarationIL = new MethodDeclarationIL(method.Symbol, BuildParameter(method.SelfParameter), BuildParameters(method.Parameters), il); break; } case IAbstractMethodDeclaration method: { declarationIL = new MethodDeclarationIL(method.Symbol, BuildParameter(method.SelfParameter), BuildParameters(method.Parameters), null); break; } case IConstructorDeclaration constructor: { var il = ilFactory.CreateGraph(constructor); var parameters = BuildConstructorParameters(constructor); var fieldInitializations = BuildFieldInitializations(constructor); declarationIL = new ConstructorIL(constructor.Symbol, parameters, fieldInitializations, il); break; } case IFieldDeclaration fieldDeclaration: declarationIL = new FieldIL(fieldDeclaration.Symbol); break; case IClassDeclaration classDeclaration: declarationIL = new ClassIL(classDeclaration.Symbol, BuildClassMembers(classDeclaration, symbolTree)); break; } declarationsIL.Add(declaration.Symbol, declarationIL); return(declarationIL); }
public string MangleName(FieldIL field) { return(Mangle(field.Symbol)); }