Example #1
0
        public void Generate(CodeGenerator generator, CodeStatementEmitOptions emitOptions)
        {
            generator.EnterElement(this);

            StartDirectives.Generate(generator);
            GenerateInner(generator, emitOptions);
            EndDirectives.Generate(generator);

            generator.ExitElement();
        }
        public void GenerateConstraints(CodeGenerator generator)
        {
            generator.EnterElement(this);

            generator.WriteLine();
            generator.Indent++;

            bool first = true;

            foreach (CodeTypeReference constraint in Constraints)
            {
                if (first)
                {
                    generator.Write(TokenType.Keyword, "where");
                    generator.Write(TokenType.Space, ' ');
                    generator.Write(TokenType.GenericTypeParameter, Name);
                    generator.Write(TokenType.Space, ' ');
                    generator.Write(TokenType.Punctuation, ':');
                    generator.Write(TokenType.Space, ' ');
                    first = false;
                }
                else
                {
                    generator.Write(TokenType.Punctuation, ',');
                    generator.Write(TokenType.Space, ' ');
                }
                constraint.Generate(generator);
            }

            if (HasConstructorConstraint)
            {
                if (first)
                {
                    generator.Write(TokenType.Keyword, "where");
                    generator.Write(TokenType.GenericTypeParameter, Name);
                    generator.Write(TokenType.Space, ' ');
                    generator.Write(TokenType.Punctuation, ':');
                    generator.Write(TokenType.Space, ' ');
                    generator.Write(TokenType.Keyword, "new");
                    generator.Write(TokenType.Punctuation, "()");
                    first = false;
                }
                else
                {
                    generator.Write(TokenType.Punctuation, ',');
                    generator.Write(TokenType.Space, ' ');
                    generator.Write(TokenType.Keyword, "new");
                    generator.Write(TokenType.Punctuation, "()");
                }
            }

            generator.Indent--;

            generator.ExitElement();
        }
Example #3
0
        public void Generate(CodeGenerator generator, string name, CodeBasicPropertyMember property, CodeCompositeTypeDeclaration enclosingType)
        {
            generator.EnterElement(this);

            StartDirectives.Generate(generator);
            Comments.Generate(generator);
            Modifiers.Generate(generator);
            GenerateInner(generator, name, property, enclosingType);
            EndDirectives.Generate(generator);

            generator.ExitElement();
        }
        public void Generate(CodeGenerator generator, CodeCompositeTypeDeclaration enclosingType)
        {
            generator.EnterElement(this);

            StartDirectives.Generate(generator);
            Comments.Generate(generator);
            generator.GenerateAttributes(CustomAttributes);
            GenerateInner(generator, enclosingType);
            EndDirectives.Generate(generator);

            generator.ExitElement();
        }
Example #5
0
        public void Generate(CodeGenerator generator)
        {
            generator.EnterElement(this);

            generator.WriteLine(TokenType.Comment, @"//--------------------------------------------------------------");
            generator.WriteLine(TokenType.Comment, @"//              _______      _____      __       ________       ");
            generator.WriteLine(TokenType.Comment, @"//             |  ___  \    /     \    |  |     |___  ___|      ");
            generator.WriteLine(TokenType.Comment, @"//             | |   \  |  /  ___  \   |  |         / /         ");
            generator.WriteLine(TokenType.Comment, @"//             | |___/ /  /  /   \  \  |  |        / /_         ");
            generator.WriteLine(TokenType.Comment, @"//             | |   \ \  \  \___/  /  |  |       /_  /         ");
            generator.WriteLine(TokenType.Comment, @"//             | |___/  |  \       /   |  |____    | /          ");
            generator.WriteLine(TokenType.Comment, @"//             |_______/    \_____/    |_______|   |/           ");
            generator.WriteLine(TokenType.Comment, @"//                                                              ");
            generator.WriteLine(TokenType.Comment, @"//                 V I S U A L    S C R I P T I N G             ");
            generator.WriteLine(TokenType.Comment, @"//--------------------------------------------------------------");
            generator.WriteLine(TokenType.Comment, @"//                                                              ");
            generator.WriteLine(TokenType.Comment, @"// THIS FILE IS AUTO-GENERATED.                                 ");
            generator.WriteLine(TokenType.Comment, @"//                                                              ");
            generator.WriteLine(TokenType.Comment, @"// ANY CHANGES WILL BE LOST NEXT TIME THIS SCRIPT IS GENERATED. ");
            generator.WriteLine(TokenType.Comment, @"//                                                              ");
            generator.WriteLine(TokenType.Comment, @"//--------------------------------------------------------------");

            StartDirectives.Generate(generator);
            if (StartDirectives.Count > 0)
            {
                generator.WriteLine();
            }

            Usings.Generate(generator);

            if (AssemblyCustomAttributes.Count > 0)
            {
                generator.GenerateAttributes(AssemblyCustomAttributes, "assembly");
                generator.WriteLine();
            }

            generator.PushUsingSet(Usings);
            Namespaces.Generate(generator);
            generator.PopUsingSet();

            if (EndDirectives.Count > 0)
            {
                generator.WriteLine();
            }
            EndDirectives.Generate(generator);

            generator.ExitElement();
        }
Example #6
0
        public void Generate(CodeGenerator generator)
        {
            generator.EnterElement(this);

            if (CustomAttributes.Count > 0)
            {
                generator.GenerateAttributes(CustomAttributes, null, true);
            }

            Direction.Generate(generator);
            Type.Generate(generator);
            generator.Write(TokenType.Space, ' ');
            generator.OutputIdentifier(TokenType.Identifier, Name);

            generator.ExitElement();
        }
        public void Generate(CodeGenerator generator)
        {
            generator.EnterElement(this);

            Comments.Generate(generator);

            generator.Write(TokenType.Keyword, "namespace");
            generator.Write(TokenType.Space, ' ');
            var names = Name.Split('.');

            generator.OutputIdentifier(TokenType.Identifier, names[0]);
            for (int i = 1; i < names.Length; i++)
            {
                generator.Write(TokenType.Punctuation, '.');
                generator.OutputIdentifier(TokenType.Identifier, names[i]);
            }
            generator.WriteOpeningBrace();
            generator.Indent++;

            Usings.Generate(generator);

            Usings.Add(new CodeUsingImport(Name));
            generator.PushUsingSet(Usings);

            bool needsBlankLine = false;

            foreach (var type in Types)
            {
                if (needsBlankLine)
                {
                    generator.WriteLine();
                }

                type.Generate(generator);
                needsBlankLine = true;
            }

            generator.PopUsingSet();

            generator.Indent--;
            generator.WriteClosingBrace();

            generator.ExitElement();
        }
Example #8
0
        public void Generate(CodeGenerator generator)
        {
            generator.EnterElement(this);

            StartDirectives.Generate(generator);
            Comments.Generate(generator);

            generator.GenerateAttributes(CustomAttributes);
            generator.OutputIdentifier(TokenType.Identifier, Name);
            if (Initializer != null)
            {
                generator.Write(TokenType.Space, ' ');
                generator.Write(TokenType.Punctuation, '=');
                generator.Write(TokenType.Space, ' ');
                Initializer.Generate(generator);
            }
            generator.WriteLine(TokenType.Punctuation, ',');

            EndDirectives.Generate(generator);

            generator.ExitElement();
        }
        public void Generate(CodeGenerator generator)
        {
            generator.EnterElement(this);

            if (ArrayElementType != null)
            {
                ArrayElementType.Generate(generator);
                generator.Write(TokenType.Punctuation, ArraySuffix);
                generator.ExitElement();
                return;
            }

            var name = RawName;

            if (SimplifiedBuiltinTypeNames.TryGetValue(name, out var simplifiedBuiltinTypeName))
            {
                generator.Write(TokenType.Keyword, simplifiedBuiltinTypeName);
                generator.ExitElement();
                return;
            }

            if (name == "var")
            {
                generator.Write(TokenType.Keyword, name);
                generator.ExitElement();
                return;
            }

            if (Global)
            {
                generator.Write(TokenType.Keyword, "global");
                generator.Write(TokenType.Punctuation, "::");
            }

            var nameBuilder         = new StringBuilder();
            var namespaceNameLength = 0;

            {
                var previousIndex = 0;

                for (var i = 0; i < name.Length; i++)
                {
                    var c = name[i];
                    if (c == '.')
                    {
                        nameBuilder.Append(name.Substring(previousIndex, i - previousIndex).EscapeIdentifier());
                        namespaceNameLength = nameBuilder.Length;
                        nameBuilder.Append('.');
                        previousIndex = i + 1;
                    }
                    else if (c == '+')
                    {
                        nameBuilder.Append(name.Substring(previousIndex, i - previousIndex).EscapeIdentifier()).Append('.');
                        previousIndex = i + 1;
                    }
                }

                nameBuilder.Append(previousIndex > 0 ? name.Substring(previousIndex).EscapeIdentifier() : name.EscapeUnqualifiedTypeIdentifier());
            }

            if (namespaceNameLength > 0)
            {
                var namespaceRef = new CodeUsingImport(nameBuilder.ToString(0, namespaceNameLength));

                var usingSets = generator.UsingSets;

                foreach (var usingSet in usingSets)
                {
                    if (usingSet.Contains(namespaceRef))
                    {
                        var ambiguityDetected            = false;
                        var unqualifiedTypeName          = nameBuilder.ToString(namespaceNameLength + 1, nameBuilder.Length - namespaceNameLength - 1);
                        var unqualifiedTypeNameWithArity = unqualifiedTypeName + (TypeArguments != null && TypeArguments.Count != 0 ? "`" + TypeArguments.Count : "");

                        if (TypesByNames.TryGetValue(unqualifiedTypeNameWithArity, out var types))
                        {
                            foreach (var type in types)
                            {
                                var otherNamespaceRef = new CodeUsingImport(type.NamespaceName);

                                if (namespaceRef != otherNamespaceRef)
                                {
                                    foreach (var otherUsingSet in usingSets)
                                    {
                                        if (otherUsingSet.Contains(otherNamespaceRef))
                                        {
                                            ambiguityDetected = true;
                                            break;
                                        }
                                    }
                                }

                                if (ambiguityDetected)
                                {
                                    break;
                                }
                            }
                        }

                        ambiguityDetected = ambiguityDetected || generator.Options.PredeclaredTypes.Where(type => type.NamespaceName != namespaceRef.Name && type.TypeName == unqualifiedTypeNameWithArity).Any();

                        if (!ambiguityDetected)
                        {
                            nameBuilder.Length = 0;
                            nameBuilder.Append(unqualifiedTypeName);
                        }

                        break;
                    }
                }
            }

            {
                var previousIndex = 0;

                var typeArgumentStart = 0;

                for (var characterIndex = 0; characterIndex < nameBuilder.Length;)
                {
                    if (nameBuilder[characterIndex] == '`')
                    {
                        generator.OutputQualifiedName(TokenType.TypeIdentifier, nameBuilder, previousIndex, characterIndex);

                        characterIndex++;

                        var arity = 0;

                        while (characterIndex < nameBuilder.Length && '0' <= nameBuilder[characterIndex] && nameBuilder[characterIndex] <= '9')
                        {
                            arity = arity * 10 + (nameBuilder[characterIndex] - '0');
                            characterIndex++;
                        }

                        previousIndex = characterIndex;

                        generator.Write(TokenType.Punctuation, '<');

                        var first = true;

                        for (var typeArgumentIndex = typeArgumentStart; typeArgumentIndex < typeArgumentStart + arity; typeArgumentIndex++)
                        {
                            var typeArgument = TypeArguments[typeArgumentIndex];

                            if (first)
                            {
                                first = false;
                            }
                            else
                            {
                                generator.Write(TokenType.Punctuation, ',');
                                if (typeArgument != null)
                                {
                                    generator.Write(TokenType.Space, ' ');
                                }
                            }

                            if (typeArgument != null)
                            {
                                typeArgument.Generate(generator);
                            }
                        }

                        typeArgumentStart += arity;

                        generator.Write(TokenType.Punctuation, '>');
                    }
                    else
                    {
                        characterIndex++;
                    }
                }

                if (previousIndex < nameBuilder.Length)
                {
                    generator.OutputQualifiedName(TokenType.TypeIdentifier, nameBuilder, previousIndex);
                }
            }

            generator.ExitElement();
        }