Example #1
0
        internal static void SetModifiers(AstNode node, Modifiers newValue)
        {
            Modifiers oldValue     = GetModifiers(node);
            AstNode   insertionPos = node.GetChildrenByRole(Attribute.AttributeRole).LastOrDefault();

            foreach (Modifiers m in VBModifierToken.AllModifiers)
            {
                if ((m & newValue) != 0)
                {
                    if ((m & oldValue) == 0)
                    {
                        // Modifier was added
                        var newToken = new VBModifierToken(TextLocation.Empty, m);
                        node.InsertChildAfter(insertionPos, newToken, ModifierRole);
                        insertionPos = newToken;
                    }
                    else
                    {
                        // Modifier already exists
                        insertionPos = node.GetChildrenByRole(ModifierRole).First(t => t.Modifier == m);
                    }
                }
                else
                {
                    if ((m & oldValue) != 0)
                    {
                        // Modifier was removed
                        node.GetChildrenByRole(ModifierRole).First(t => t.Modifier == m).Remove();
                    }
                }
            }
        }
        internal static void SetModifiers(AstNode node, LambdaExpressionModifiers newValue)
        {
            LambdaExpressionModifiers oldValue = GetModifiers(node);
            AstNode insertionPos = null;

            foreach (Modifiers m in VBModifierToken.AllModifiers)
            {
                if ((m & (Modifiers)newValue) != 0)
                {
                    if ((m & (Modifiers)oldValue) == 0)
                    {
                        // Modifier was added
                        var newToken = new VBModifierToken(AstLocation.Empty, m);
                        node.InsertChildAfter(insertionPos, newToken, ModifierRole);
                        insertionPos = newToken;
                    }
                    else
                    {
                        // Modifier already exists
                        insertionPos = node.GetChildrenByRole(ModifierRole).First(t => t.Modifier == m);
                    }
                }
                else
                {
                    if ((m & (Modifiers)oldValue) != 0)
                    {
                        // Modifier was removed
                        node.GetChildrenByRole(ModifierRole).First(t => t.Modifier == m).Remove();
                    }
                }
            }
        }
        List <Expression> CollectNodes(AstNode parant, AstNode node)
        {
            List <Expression> returned = new List <Expression>();

            var children = parant.GetChildrenByRole(Roles.Argument);

            for (int i = 0; i < children.Count(); i++)
            {
                if (children.ElementAt(i).Equals(node))
                {
                    for (int j = i; j < children.Count(); j++)
                    {
                        if (children.ElementAt(j) is Expression && children.ElementAt(j).Role == Roles.Argument && !(children.ElementAt(j) is NamedArgumentExpression))
                        {
                            returned.Add(children.ElementAt(j));
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
            return(returned);
        }
        void HandleInstanceFieldInitializers(IEnumerable <AstNode> members)
        {
            var instanceCtors = members.OfType <ConstructorDeclaration>().Where(c => (c.Modifiers & Modifiers.Static) == 0).ToArray();
            var instanceCtorsNotChainingWithThis = instanceCtors.Where(ctor => !thisCallPattern.IsMatch(ctor.Body.Statements.FirstOrDefault())).ToArray();

            if (instanceCtorsNotChainingWithThis.Length > 0)
            {
                MethodDefinition ctorMethodDef = instanceCtorsNotChainingWithThis[0].Annotation <MethodDefinition>();
                if (ctorMethodDef != null && ctorMethodDef.DeclaringType.IsValueType)
                {
                    return;
                }

                // Recognize field initializers:
                // Convert first statement in all ctors (if all ctors have the same statement) into a field initializer.
                bool allSame;
                do
                {
                    Match m = fieldInitializerPattern.Match(instanceCtorsNotChainingWithThis[0].Body.FirstOrDefault());
                    if (!m.Success)
                    {
                        break;
                    }

                    FieldDefinition fieldDef = m.Get <AstNode>("fieldAccess").Single().Annotation <FieldReference>().ResolveWithinSameModule();
                    if (fieldDef == null)
                    {
                        break;
                    }
                    AstNode fieldOrEventDecl = members.FirstOrDefault(f => f.Annotation <FieldDefinition>() == fieldDef);
                    if (fieldOrEventDecl == null)
                    {
                        break;
                    }
                    Expression initializer = m.Get <Expression>("initializer").Single();
                    // 'this'/'base' cannot be used in field initializers
                    if (initializer.DescendantsAndSelf.Any(n => n is ThisReferenceExpression || n is BaseReferenceExpression))
                    {
                        break;
                    }

                    allSame = true;
                    for (int i = 1; i < instanceCtorsNotChainingWithThis.Length; i++)
                    {
                        if (!instanceCtors[0].Body.First().IsMatch(instanceCtorsNotChainingWithThis[i].Body.FirstOrDefault()))
                        {
                            allSame = false;
                        }
                    }
                    if (allSame)
                    {
                        foreach (var ctor in instanceCtorsNotChainingWithThis)
                        {
                            ctor.Body.First().Remove();
                        }
                        fieldOrEventDecl.GetChildrenByRole(AstNode.Roles.Variable).Single().Initializer = initializer.Detach();
                    }
                } while (allSame);
            }
        }
Example #5
0
            private List <NamedArgumentExpression> CollectNodes(AstNode parant, AstNode node)
            {
                List <NamedArgumentExpression> returned = new List <NamedArgumentExpression>();
                var children = parant.GetChildrenByRole(Roles.Argument);

                for (int i = children.Count() - 1; i > -1; i--)
                {
                    if (children.ElementAt(i).Equals(node))
                    {
                        for (int j = i; j > -1; j--)
                        {
                            if (children.ElementAt(j) is Expression && children.ElementAt(j).Role == Roles.Argument && children.ElementAt(j) is NamedArgumentExpression)
                            {
                                returned.Add(children.ElementAt(j) as NamedArgumentExpression);
                            }
                            else
                            {
                                break;
                            }
                        }
                        break;
                    }
                }
                return(returned);
            }
Example #6
0
		internal static Modifiers GetModifiers(AstNode node)
		{
			Modifiers m = 0;
			foreach (CSharpModifierToken t in node.GetChildrenByRole (ModifierRole)) {
				m |= t.Modifier;
			}
			return m;
		}
        internal static LambdaExpressionModifiers GetModifiers(AstNode node)
        {
            LambdaExpressionModifiers m = 0;

            foreach (VBModifierToken t in node.GetChildrenByRole(ModifierRole))
            {
                m |= (LambdaExpressionModifiers)t.Modifier;
            }
            return(m);
        }
Example #8
0
        internal static Modifiers GetModifiers(AstNode node)
        {
            Modifiers m = 0;

            foreach (VBModifierToken t in node.GetChildrenByRole(ModifierRole))
            {
                m |= t.Modifier;
            }
            return(m);
        }
Example #9
0
        CodeAction ReplaceWithFullTypeNameAction(RefactoringContext context, AstNode node, ITypeDefinition typeDefinition)
        {
            AstType astType             = context.CreateShortType(typeDefinition);
            string  textWithoutGenerics = astType.ToString();

            foreach (var typeArg in node.GetChildrenByRole(Roles.TypeArgument))
            {
                astType.AddChild(typeArg.Clone(), Roles.TypeArgument);
            }
            return(new CodeAction(textWithoutGenerics, s => s.Replace(node, astType), node));
        }
		internal static void SetModifiers(AstNode node, Modifiers newValue)
		{
			Modifiers oldValue = GetModifiers(node);
			AstNode insertionPos = node.GetChildrenByRole(AttributeRole).LastOrDefault();
			foreach (Modifiers m in CSharpModifierToken.AllModifiers) {
				if ((m & newValue) != 0) {
					if ((m & oldValue) == 0) {
						// Modifier was added
						node.InsertChildAfter(insertionPos, new CSharpModifierToken(AstLocation.Empty, m), ModifierRole);
					} else {
						// Modifier already exists
						insertionPos = node.GetChildrenByRole(ModifierRole).First(t => t.Modifier == m);
					}
				} else {
					if ((m & oldValue) != 0) {
						// Modifier was removed
						node.GetChildrenByRole (ModifierRole).First(t => t.Modifier == m).Remove();
					}
				}
			}
		}
Example #11
0
 private static string GetIdentifierName(AstNode node)
 {
     foreach (var obj in
              from child in node.GetChildrenByRole(Roles.Identifier)
              from propertyInfo in child
              .GetType()
              .GetProperties(
                  System.Reflection.BindingFlags.Instance |
                  System.Reflection.BindingFlags.Public)
              .Where(x => x.Name == "Name")
              select propertyInfo.GetValue(child, null))
     {
         return(obj.ToString());
     }
     throw new MissingFieldException("Missing Role 'Identifier' from AstNode");
 }
Example #12
0
            private bool IsRedundant(AstNode parant, List <string> parameterNames)
            {
                var arguments = parant.GetChildrenByRole(Roles.Argument).Where(k => k is NamedArgumentExpression);

                if (!arguments.Any())
                {
                    return(false);
                }

                List <string> argumentNames = new List <string>();

                foreach (var argument in arguments)
                {
                    argumentNames.Add((argument as NamedArgumentExpression).Name);
                }

                return(IsSublist(argumentNames, parameterNames));
            }
			static int GetParameters (AstNode x)
			{
				return x.GetChildrenByRole (Roles.Parameter).Count ();
			}
            NullValueAnalysis GetAnalysis(AstNode parentFunction)
            {
                NullValueAnalysis analysis;

                if (cachedNullAnalysis.TryGetValue(parentFunction, out analysis))
                {
                    return(analysis);
                }

                analysis = new NullValueAnalysis(ctx, parentFunction.GetChildByRole(Roles.Body), parentFunction.GetChildrenByRole(Roles.Parameter), ctx.CancellationToken);
                cachedNullAnalysis [parentFunction] = analysis;
                return(analysis);
            }
Example #15
0
        internal void HandleInstanceFieldInitializers(IEnumerable <AstNode> members)
        {
            var instanceCtors = members.OfType <ConstructorDeclaration>().Where(c => (c.Modifiers & Modifiers.Static) == 0).ToArray();
            var instanceCtorsNotChainingWithThis = instanceCtors.Where(ctor => !thisCallPattern.IsMatch(ctor.Body.Statements.FirstOrDefault())).ToArray();

            if (instanceCtorsNotChainingWithThis.Length > 0)
            {
                var ctorMethodDef = instanceCtorsNotChainingWithThis[0].GetSymbol() as IMethod;
                if (ctorMethodDef != null && ctorMethodDef.DeclaringType.IsReferenceType == false)
                {
                    return;
                }

                // Recognize field or property initializers:
                // Translate first statement in all ctors (if all ctors have the same statement) into an initializer.
                bool allSame;
                do
                {
                    Match m = fieldInitializerPattern.Match(instanceCtorsNotChainingWithThis[0].Body.FirstOrDefault());
                    if (!m.Success)
                    {
                        break;
                    }

                    IMember fieldOrPropertyOrEvent = (m.Get <AstNode>("fieldAccess").Single().GetSymbol() as IMember)?.MemberDefinition;
                    if (!(fieldOrPropertyOrEvent is IField) && !(fieldOrPropertyOrEvent is IProperty) && !(fieldOrPropertyOrEvent is IEvent))
                    {
                        break;
                    }
                    AstNode fieldOrPropertyOrEventDecl = members.FirstOrDefault(f => f.GetSymbol() == fieldOrPropertyOrEvent);
                    if (fieldOrPropertyOrEventDecl == null)
                    {
                        break;
                    }
                    Expression initializer = m.Get <Expression>("initializer").Single();
                    // 'this'/'base' cannot be used in initializers
                    if (initializer.DescendantsAndSelf.Any(n => n is ThisReferenceExpression || n is BaseReferenceExpression))
                    {
                        break;
                    }

                    allSame = true;
                    for (int i = 1; i < instanceCtorsNotChainingWithThis.Length; i++)
                    {
                        if (!instanceCtorsNotChainingWithThis[0].Body.First().IsMatch(instanceCtorsNotChainingWithThis[i].Body.FirstOrDefault()))
                        {
                            allSame = false;
                        }
                    }
                    if (allSame)
                    {
                        foreach (var ctor in instanceCtorsNotChainingWithThis)
                        {
                            ctor.Body.First().Remove();
                        }
                        if (fieldOrPropertyOrEventDecl is PropertyDeclaration pd)
                        {
                            pd.Initializer = initializer.Detach();
                        }
                        else
                        {
                            fieldOrPropertyOrEventDecl.GetChildrenByRole(Roles.Variable).Single().Initializer = initializer.Detach();
                        }
                    }
                } while (allSame);
            }
        }
Example #16
0
 private static string GetIdentifierName(AstNode node)
 {
     foreach (var obj in
         from child in node.GetChildrenByRole(Roles.Identifier)
         from propertyInfo in child
             .GetType()
             .GetProperties(
                 System.Reflection.BindingFlags.Instance |
                 System.Reflection.BindingFlags.Public)
             .Where(x => x.Name == "Name")
         select propertyInfo.GetValue(child, null))
     {
         return obj.ToString();
     }
     throw new MissingFieldException("Missing Role 'Identifier' from AstNode");
 }
Example #17
0
        public void ConvertSymbol(ISymbol symbol, TokenWriter writer, CSharpFormattingOptions formattingPolicy)
        {
            if (symbol == null)
            {
                throw new ArgumentNullException(nameof(symbol));
            }
            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }
            if (formattingPolicy == null)
            {
                throw new ArgumentNullException(nameof(formattingPolicy));
            }

            TypeSystemAstBuilder astBuilder = CreateAstBuilder();
            AstNode node = astBuilder.ConvertSymbol(symbol);

            writer.StartNode(node);
            EntityDeclaration entityDecl = node as EntityDeclaration;

            if (entityDecl != null)
            {
                PrintModifiers(entityDecl.Modifiers, writer);
            }

            if ((ConversionFlags & ConversionFlags.ShowDefinitionKeyword) == ConversionFlags.ShowDefinitionKeyword)
            {
                if (node is TypeDeclaration)
                {
                    switch (((TypeDeclaration)node).ClassType)
                    {
                    case ClassType.Class:
                        writer.WriteKeyword(Roles.ClassKeyword, "class");
                        break;

                    case ClassType.Struct:
                        writer.WriteKeyword(Roles.StructKeyword, "struct");
                        break;

                    case ClassType.Interface:
                        writer.WriteKeyword(Roles.InterfaceKeyword, "interface");
                        break;

                    case ClassType.Enum:
                        writer.WriteKeyword(Roles.EnumKeyword, "enum");
                        break;

                    case ClassType.RecordClass:
                        writer.WriteKeyword(Roles.RecordKeyword, "record");
                        break;

                    default:
                        throw new Exception("Invalid value for ClassType");
                    }
                    writer.Space();
                }
                else if (node is DelegateDeclaration)
                {
                    writer.WriteKeyword(Roles.DelegateKeyword, "delegate");
                    writer.Space();
                }
                else if (node is EventDeclaration)
                {
                    writer.WriteKeyword(EventDeclaration.EventKeywordRole, "event");
                    writer.Space();
                }
                else if (node is NamespaceDeclaration)
                {
                    writer.WriteKeyword(Roles.NamespaceKeyword, "namespace");
                    writer.Space();
                }
            }

            if ((ConversionFlags & ConversionFlags.PlaceReturnTypeAfterParameterList) != ConversionFlags.PlaceReturnTypeAfterParameterList &&
                (ConversionFlags & ConversionFlags.ShowReturnType) == ConversionFlags.ShowReturnType)
            {
                var rt = node.GetChildByRole(Roles.Type);
                if (!rt.IsNull)
                {
                    rt.AcceptVisitor(new CSharpOutputVisitor(writer, formattingPolicy));
                    writer.Space();
                }
            }

            if (symbol is ITypeDefinition)
            {
                WriteTypeDeclarationName((ITypeDefinition)symbol, writer, formattingPolicy);
            }
            else if (symbol is IMember)
            {
                WriteMemberDeclarationName((IMember)symbol, writer, formattingPolicy);
            }
            else
            {
                writer.WriteIdentifier(Identifier.Create(symbol.Name));
            }

            if ((ConversionFlags & ConversionFlags.ShowParameterList) == ConversionFlags.ShowParameterList && HasParameters(symbol))
            {
                writer.WriteToken(symbol.SymbolKind == SymbolKind.Indexer ? Roles.LBracket : Roles.LPar, symbol.SymbolKind == SymbolKind.Indexer ? "[" : "(");
                bool first = true;
                foreach (var param in node.GetChildrenByRole(Roles.Parameter))
                {
                    if ((ConversionFlags & ConversionFlags.ShowParameterModifiers) == 0)
                    {
                        param.ParameterModifier = ParameterModifier.None;
                    }
                    if ((ConversionFlags & ConversionFlags.ShowParameterDefaultValues) == 0)
                    {
                        param.DefaultExpression.Detach();
                    }
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        writer.WriteToken(Roles.Comma, ",");
                        writer.Space();
                    }
                    param.AcceptVisitor(new CSharpOutputVisitor(writer, formattingPolicy));
                }
                writer.WriteToken(symbol.SymbolKind == SymbolKind.Indexer ? Roles.RBracket : Roles.RPar, symbol.SymbolKind == SymbolKind.Indexer ? "]" : ")");
            }

            if ((ConversionFlags & ConversionFlags.PlaceReturnTypeAfterParameterList) == ConversionFlags.PlaceReturnTypeAfterParameterList &&
                (ConversionFlags & ConversionFlags.ShowReturnType) == ConversionFlags.ShowReturnType)
            {
                var rt = node.GetChildByRole(Roles.Type);
                if (!rt.IsNull)
                {
                    writer.Space();
                    writer.WriteToken(Roles.Colon, ":");
                    writer.Space();
                    if (symbol is IField f && CSharpDecompiler.IsFixedField(f, out var type, out int elementCount))
                    {
                        rt = astBuilder.ConvertType(type);
                        new IndexerExpression(new TypeReferenceExpression(rt), astBuilder.ConvertConstantValue(f.Compilation.FindType(KnownTypeCode.Int32), elementCount))
                        .AcceptVisitor(new CSharpOutputVisitor(writer, formattingPolicy));
                    }
                    else
                    {
                        rt.AcceptVisitor(new CSharpOutputVisitor(writer, formattingPolicy));
                    }
                }
            }
        void HandleInstanceFieldInitializers(IEnumerable <AstNode> members)
        {
            var instanceCtors = members.OfType <ConstructorDeclaration>().Where(c => (c.Modifiers & Modifiers.Static) == 0).ToArray();
            var instanceCtorsNotChainingWithThis = instanceCtors.Where(ctor => !thisCallPattern.IsMatch(ctor.Body.Statements.FirstOrDefault())).ToArray();

            if (instanceCtorsNotChainingWithThis.Length > 0)
            {
                MethodDef ctorMethodDef = instanceCtorsNotChainingWithThis[0].Annotation <MethodDef>();
                if (ctorMethodDef != null && DnlibExtensions.IsValueType(ctorMethodDef.DeclaringType))
                {
                    return;
                }

                // Recognize field initializers:
                // Convert first statement in all ctors (if all ctors have the same statement) into a field initializer.
                bool allSame;
                do
                {
                    Match m = fieldInitializerPattern.Match(instanceCtorsNotChainingWithThis[0].Body.FirstOrDefault());
                    if (!m.Success)
                    {
                        break;
                    }

                    FieldDef fieldDef = m.Get <AstNode>("fieldAccess").Single().Annotation <IField>().ResolveFieldWithinSameModule();
                    if (fieldDef == null)
                    {
                        break;
                    }
                    AstNode fieldOrEventDecl = members.FirstOrDefault(f => f.Annotation <FieldDef>() == fieldDef);
                    if (fieldOrEventDecl == null)
                    {
                        break;
                    }
                    Expression initializer = m.Get <Expression>("initializer").Single();
                    // 'this'/'base' cannot be used in field initializers
                    if (initializer.DescendantsAndSelf.Any(n => n is ThisReferenceExpression || n is BaseReferenceExpression))
                    {
                        break;
                    }

                    allSame = true;
                    for (int i = 1; i < instanceCtorsNotChainingWithThis.Length; i++)
                    {
                        if (!instanceCtors[0].Body.First().IsMatch(instanceCtorsNotChainingWithThis[i].Body.FirstOrDefault()))
                        {
                            allSame = false;
                            break;
                        }
                    }
                    if (allSame)
                    {
                        var ctorIlRanges = new List <Tuple <MemberMapping, List <ILRange> > >(instanceCtorsNotChainingWithThis.Length);
                        for (int i = 0; i < instanceCtorsNotChainingWithThis.Length; i++)
                        {
                            var ctor = instanceCtorsNotChainingWithThis[i];
                            var stmt = ctor.Body.First();
                            stmt.Remove();
                            var mm = ctor.Annotation <MemberMapping>() ?? ctor.Body.Annotation <MemberMapping>();
                            Debug.Assert(mm != null);
                            if (mm != null)
                            {
                                ctorIlRanges.Add(Tuple.Create(mm, stmt.GetAllRecursiveILRanges()));
                            }
                        }
                        var varInit = fieldOrEventDecl.GetChildrenByRole(Roles.Variable).Single();
                        initializer.Remove();
                        initializer.RemoveAllILRangesRecursive();
                        varInit.Initializer = initializer;
                        fieldOrEventDecl.AddAnnotation(ctorIlRanges);
                    }
                } while (allSame);
            }
        }
Example #19
0
 CodeAction ReplaceWithFullTypeNameAction(RefactoringContext context, AstNode node, ITypeDefinition typeDefinition)
 {
     AstType astType = context.CreateShortType(typeDefinition);
     string textWithoutGenerics = astType.ToString();
     foreach (var typeArg in node.GetChildrenByRole(Roles.TypeArgument)) {
         astType.AddChild(typeArg.Clone(), Roles.TypeArgument);
     }
     return new CodeAction(textWithoutGenerics, s => s.Replace(node, astType), node);
 }
Example #20
0
 static int GetParameters(AstNode x)
 {
     return(x.GetChildrenByRole(Roles.Parameter).Count());
 }
Example #21
0
        /// <summary>
        /// Inserts 'newUsing' in the current scope.
        /// This method will try to insert new usings in the correct position (depending on
        /// where the existing usings are; and maintaining the sort order).
        /// </summary>
        public static void InsertUsing(RefactoringContext context, Script script, AstNode newUsing)
        {
            UsingInfo newUsingInfo       = new UsingInfo(newUsing, context);
            AstNode   enclosingNamespace = context.GetNode <NamespaceDeclaration>() ?? context.RootNode;
            // Find nearest enclosing parent that has usings:
            AstNode usingParent = enclosingNamespace;

            while (usingParent != null && !usingParent.Children.OfType <UsingDeclaration>().Any())
            {
                usingParent = usingParent.Parent;
            }
            if (usingParent == null)
            {
                // No existing usings at all -> use the default location
                if (script.FormattingOptions.UsingPlacement == UsingPlacement.TopOfFile)
                {
                    usingParent = context.RootNode;
                }
                else
                {
                    usingParent = enclosingNamespace;
                }
            }
            // Find the main block of using declarations in the chosen scope:
            AstNode blockStart = usingParent.Children.FirstOrDefault(IsUsingDeclaration);
            AstNode insertionPoint;
            bool    insertAfter = false;

            if (blockStart == null)
            {
                // no using declarations in the file
                Debug.Assert(SyntaxTree.MemberRole == NamespaceDeclaration.MemberRole);
                insertionPoint = usingParent.GetChildrenByRole(SyntaxTree.MemberRole).SkipWhile(CanAppearBeforeUsings).FirstOrDefault();
            }
            else
            {
                insertionPoint = blockStart;
                while (IsUsingFollowing(ref insertionPoint) && newUsingInfo.CompareTo(new UsingInfo(insertionPoint, context)) > 0)
                {
                    insertionPoint = insertionPoint.NextSibling;
                }
                if (!IsUsingDeclaration(insertionPoint))
                {
                    // Insert after last using instead of before next node
                    // This affects where empty lines get placed.
                    insertionPoint = insertionPoint.PrevSibling;
                    insertAfter    = true;
                }
            }
            if (insertionPoint != null)
            {
                if (insertAfter)
                {
                    script.InsertAfter(insertionPoint, newUsing);
                }
                else
                {
                    script.InsertBefore(insertionPoint, newUsing);
                }
            }
        }
Example #22
0
        public string Generate(ISymbol symbol)
        {
            if (symbol == null)
            {
                throw new ArgumentNullException("symbol");
            }

            StringWriter writer = new StringWriter();

            _writer = new TextWriterTokenWriter(writer);
            _policy = FormattingOptionsFactory.CreateMono();

            TypeSystemAstBuilder astBuilder = CreateAstBuilder();

            astBuilder.AlwaysUseShortTypeNames = true;
            AstNode node = astBuilder.ConvertSymbol(symbol);

            if (symbol is ITypeDefinition)
            {
                WriteTypeDeclarationName((ITypeDefinition)symbol, _writer, _policy);
            }
            else if (symbol is IMember)
            {
                WriteMemberDeclarationName((IMember)symbol, _writer, _policy);
            }
            else
            {
                _writer.WriteIdentifier(Identifier.Create(symbol.Name));
            }

            if (HasParameters(symbol))
            {
                _writer.WriteToken(symbol.SymbolKind == SymbolKind.Indexer ? Roles.LBracket : Roles.LPar, symbol.SymbolKind == SymbolKind.Indexer ? "[" : "(");
                IEnumerable <ParameterDeclaration> parameters = new List <ParameterDeclaration>(node.GetChildrenByRole(Roles.Parameter));
                if (symbol is IMethod && ((IMethod)symbol).IsExtensionMethod)
                {
                    parameters = parameters.Skip(1);
                }

                WriteCommaSeparatedList(parameters);
                _writer.WriteToken(symbol.SymbolKind == SymbolKind.Indexer ? Roles.RBracket : Roles.RPar, symbol.SymbolKind == SymbolKind.Indexer ? "]" : ")");
            }
            if (_includePlaceholders)
            {
                _writer.WriteToken(Roles.Text, "$0");
            }
            return(writer.ToString());
        }
Example #23
0
        public void ConvertSymbol(ISymbol symbol, TokenWriter writer, CSharpFormattingOptions formattingPolicy)
        {
            if (symbol == null)
            {
                throw new ArgumentNullException("symbol");
            }
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            if (formattingPolicy == null)
            {
                throw new ArgumentNullException("formattingPolicy");
            }

            TypeSystemAstBuilder astBuilder = CreateAstBuilder();
            AstNode           node          = astBuilder.ConvertSymbol(symbol);
            EntityDeclaration entityDecl    = node as EntityDeclaration;

            if (entityDecl != null)
            {
                PrintModifiers(entityDecl.Modifiers, writer);
            }

            if ((ConversionFlags & ConversionFlags.ShowDefinitionKeyword) == ConversionFlags.ShowDefinitionKeyword)
            {
                if (node is TypeDeclaration)
                {
                    switch (((TypeDeclaration)node).ClassType)
                    {
                    case ClassType.Class:
                        writer.WriteKeyword(Roles.ClassKeyword, "class");
                        break;

                    case ClassType.Struct:
                        writer.WriteKeyword(Roles.StructKeyword, "struct");
                        break;

                    case ClassType.Interface:
                        writer.WriteKeyword(Roles.InterfaceKeyword, "interface");
                        break;

                    case ClassType.Enum:
                        writer.WriteKeyword(Roles.EnumKeyword, "enum");
                        break;

                    default:
                        throw new Exception("Invalid value for ClassType");
                    }
                    writer.Space();
                }
                else if (node is DelegateDeclaration)
                {
                    writer.WriteKeyword(Roles.DelegateKeyword, "delegate");
                    writer.Space();
                }
                else if (node is EventDeclaration)
                {
                    writer.WriteKeyword(EventDeclaration.EventKeywordRole, "event");
                    writer.Space();
                }
                else if (node is NamespaceDeclaration)
                {
                    writer.WriteKeyword(Roles.NamespaceKeyword, "namespace");
                    writer.Space();
                }
            }

            if ((ConversionFlags & ConversionFlags.PlaceReturnTypeAfterParameterList) != ConversionFlags.PlaceReturnTypeAfterParameterList &&
                (ConversionFlags & ConversionFlags.ShowReturnType) == ConversionFlags.ShowReturnType)
            {
                var rt = node.GetChildByRole(Roles.Type);
                if (!rt.IsNull)
                {
                    rt.AcceptVisitor(new CSharpOutputVisitor(writer, formattingPolicy));
                    writer.Space();
                }
            }

            if (symbol is ITypeDefinition)
            {
                WriteTypeDeclarationName((ITypeDefinition)symbol, writer, formattingPolicy);
            }
            else if (symbol is IMember)
            {
                WriteMemberDeclarationName((IMember)symbol, writer, formattingPolicy);
            }
            else
            {
                writer.WriteIdentifier(Identifier.Create(symbol.Name));
            }

            if ((ConversionFlags & ConversionFlags.ShowParameterList) == ConversionFlags.ShowParameterList && HasParameters(symbol))
            {
                writer.WriteToken(symbol.SymbolKind == SymbolKind.Indexer ? Roles.LBracket : Roles.LPar, symbol.SymbolKind == SymbolKind.Indexer ? "[" : "(");
                bool first = true;
                foreach (var param in node.GetChildrenByRole(Roles.Parameter))
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        writer.WriteToken(Roles.Comma, ",");
                        writer.Space();
                    }
                    param.AcceptVisitor(new CSharpOutputVisitor(writer, formattingPolicy));
                }
                writer.WriteToken(symbol.SymbolKind == SymbolKind.Indexer ? Roles.RBracket : Roles.RPar, symbol.SymbolKind == SymbolKind.Indexer ? "]" : ")");
            }

            if ((ConversionFlags & ConversionFlags.PlaceReturnTypeAfterParameterList) == ConversionFlags.PlaceReturnTypeAfterParameterList &&
                (ConversionFlags & ConversionFlags.ShowReturnType) == ConversionFlags.ShowReturnType)
            {
                var rt = node.GetChildByRole(Roles.Type);
                if (!rt.IsNull)
                {
                    writer.Space();
                    writer.WriteToken(Roles.Colon, ":");
                    writer.Space();
                    rt.AcceptVisitor(new CSharpOutputVisitor(writer, formattingPolicy));
                }
            }

            if ((ConversionFlags & ConversionFlags.ShowBody) == ConversionFlags.ShowBody && !(node is TypeDeclaration))
            {
                IProperty property = symbol as IProperty;
                if (property != null)
                {
                    writer.Space();
                    writer.WriteToken(Roles.LBrace, "{");
                    writer.Space();
                    if (property.CanGet)
                    {
                        writer.WriteKeyword(PropertyDeclaration.GetKeywordRole, "get");
                        writer.WriteToken(Roles.Semicolon, ";");
                        writer.Space();
                    }
                    if (property.CanSet)
                    {
                        writer.WriteKeyword(PropertyDeclaration.SetKeywordRole, "set");
                        writer.WriteToken(Roles.Semicolon, ";");
                        writer.Space();
                    }
                    writer.WriteToken(Roles.RBrace, "}");
                }
                else
                {
                    writer.WriteToken(Roles.Semicolon, ";");
                }
            }
        }