private void BuildConstructorSymbol(IConstructorDeclarationSyntax constructor) { constructor.Symbol.BeginFulfilling(); var selfParameterType = ResolveSelfParameterType(constructor.ImplicitSelfParameter, constructor.DeclaringClass); var resolver = new TypeResolver(constructor.File, diagnostics); var parameterTypes = ResolveParameterTypes(resolver, constructor.Parameters, constructor.DeclaringClass); var declaringClassSymbol = constructor.DeclaringClass.Symbol.Result; var symbol = new ConstructorSymbol(declaringClassSymbol, constructor.Name, parameterTypes); constructor.Symbol.Fulfill(symbol); symbolTree.Add(symbol); BuildSelParameterSymbol(symbol, constructor.ImplicitSelfParameter, selfParameterType); BuildParameterSymbols(symbol, constructor.Parameters, parameterTypes); ResolveReachabilityAnnotations(constructor); }
private static void GenerateRecord(ScriptGenerator generator, RecordSymbol recordSymbol) { ScriptTextWriter writer = generator.Writer; string recordName = recordSymbol.FullGeneratedName; writer.Write("function "); writer.Write(recordName); writer.Write("("); ConstructorSymbol ctorSymbol = recordSymbol.Constructor; if (ctorSymbol?.Parameters != null) { bool firstParameter = true; foreach (ParameterSymbol parameterSymbol in ctorSymbol.Parameters) { if (firstParameter == false) { writer.Write(", "); } writer.Write(parameterSymbol.GeneratedName); firstParameter = false; } } writer.Write(") {"); if (recordSymbol.Constructor != null) { writer.Indent++; writer.WriteLine(); writer.WriteLine("var $o = {};"); CodeGenerator.GenerateScript(generator, recordSymbol.Constructor); writer.Write("return $o;"); writer.WriteLine(); writer.Indent--; } else { writer.Write(" return {}; "); } writer.Write("}"); writer.WriteLine(); }
public ConstructorDeclaration( CodeFile file, TextSpan span, IClassDeclaration declaringClass, ConstructorSymbol symbol, TextSpan nameSpan, ISelfParameter implicitSelfParameter, FixedList <IConstructorParameter> parameters, IReachabilityAnnotations reachabilityAnnotations, IBody body) : base(file, span, symbol, nameSpan, parameters, reachabilityAnnotations) { Symbol = symbol; ImplicitSelfParameter = implicitSelfParameter; Body = body; DeclaringClass = declaringClass; }
private static void GenerateRecord(ScriptGenerator generator, RecordSymbol recordSymbol) { ScriptTextWriter writer = generator.Writer; string recordName = recordSymbol.GeneratedName; if ((recordSymbol.Namespace.Length == 0) || recordSymbol.IgnoreNamespace) { writer.Write("window."); } else { writer.Write(recordSymbol.GeneratedNamespace); writer.Write("."); } writer.Write("$create_"); writer.Write(recordName); writer.WriteTrimmed(" = "); writer.Write("function"); if (generator.Options.DebugFlavor) { writer.Write(" "); writer.Write(recordSymbol.FullGeneratedName.Replace(".", "_")); } writer.Write("("); if (recordSymbol.Constructor != null) { ConstructorSymbol ctorSymbol = recordSymbol.Constructor; if (ctorSymbol.Parameters != null) { bool firstParameter = true; foreach (ParameterSymbol parameterSymbol in ctorSymbol.Parameters) { if (firstParameter == false) { writer.WriteTrimmed(", "); } writer.Write(parameterSymbol.GeneratedName); firstParameter = false; } } } writer.WriteTrimmed(")"); writer.WriteTrimmed(" {"); if (recordSymbol.Constructor != null) { writer.Indent++; writer.WriteNewLine(); writer.Write("var $o"); writer.WriteTrimmed(" = "); writer.WriteTrimmed("{ "); writer.Write("};"); writer.WriteNewLine(); CodeGenerator.GenerateScript(generator, recordSymbol.Constructor); writer.Write("return $o;"); writer.WriteNewLine(); writer.Indent--; } else { writer.WriteTrimmed(" return {}; "); } writer.Write("}"); writer.WriteSignificantNewLine(); }
private MethodSymbol BuildMethod(MethodDeclarationNode methodNode, TypeSymbol typeSymbol) { MethodSymbol method = null; if (methodNode.NodeType == ParseNodeType.ConstructorDeclaration) { method = new ConstructorSymbol(typeSymbol, (methodNode.Modifiers & Modifiers.Static) != 0); } else { TypeSymbol returnType = typeSymbol.SymbolSet.ResolveType(methodNode.Type, _symbolTable, typeSymbol); Debug.Assert(returnType != null); if (returnType != null) { method = new MethodSymbol(methodNode.Name, typeSymbol, returnType); BuildMemberDetails(method, typeSymbol, methodNode, methodNode.Attributes); ICollection <string> conditions = null; foreach (AttributeNode attrNode in methodNode.Attributes) { if (attrNode.TypeName.Equals("Conditional", StringComparison.Ordinal)) { if (conditions == null) { conditions = new List <string>(); } Debug.Assert(attrNode.Arguments[0] is LiteralNode); Debug.Assert(((LiteralNode)attrNode.Arguments[0]).Value is string); conditions.Add((string)((LiteralNode)attrNode.Arguments[0]).Value); } } if (conditions != null) { method.SetConditions(conditions); } } } if (method != null) { if ((methodNode.Modifiers & Modifiers.Abstract) != 0) { method.SetImplementationState(SymbolImplementationFlags.Abstract); } else if ((methodNode.Modifiers & Modifiers.Override) != 0) { method.SetImplementationState(SymbolImplementationFlags.Override); } if ((methodNode.Parameters != null) && (methodNode.Parameters.Count != 0)) { foreach (ParameterNode parameterNode in methodNode.Parameters) { ParameterSymbol paramSymbol = BuildParameter(parameterNode, method); if (paramSymbol != null) { paramSymbol.SetParseContext(parameterNode); method.AddParameter(paramSymbol); } } } if ((method.Visibility & MemberVisibility.Static) != 0) { string scriptAlias = GetAttributeValue(methodNode.Attributes, "ScriptAlias"); if (scriptAlias != null) { method.SetAlias(scriptAlias); } } } return(method); }