コード例 #1
0
        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);
        }
コード例 #2
0
        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;
 }
コード例 #4
0
        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();
        }
コード例 #5
0
        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);
        }