コード例 #1
0
        private async Task <Document> FixSharedInterfaceAsync(Document document, InterfaceDeclarationSyntax interfaceType, SemanticModel model, CancellationToken cancellationToken)
        {
            var editor = await DocumentEditor.CreateAsync(document);

            var seq = interfaceType.ChildNodes()
                      .OfType <MethodDeclarationSyntax>()
                      .Select(x => new
            {
                targetMethod = x,
                methodSymbol = model.GetDeclaredSymbol(x),
                returnType   = model.GetDeclaredSymbol(x)?.ReturnType as INamedTypeSymbol
            })
                      .Where(x => {
                return(!x.methodSymbol.GetAttributes().Any(attr => attr.AttributeClass.Name == "OperationAttribute"));
            })
                      .Where(x => x.returnType != null)
                      .Select(x =>
            {
                return(new { x.targetMethod, newMethod = FixAsyncFunctionMethod(x.targetMethod, cancellationToken) });
            });

            foreach (var item in seq)
            {
                editor.ReplaceNode(item.targetMethod, item.newMethod);
            }

            return(editor.GetChangedDocument());
        }
コード例 #2
0
        public override void VisitInterfaceDeclaration(InterfaceDeclarationSyntax node)
        {
            var isPartial  = node.ChildTokens().Any(x => x.Kind() == SyntaxKind.PartialKeyword);
            var defineName = node.ChildTokens().FirstOrDefault(x => x.Kind() == SyntaxKind.IdentifierToken).ToString();

            // ジェネリック型を定義している場合
            if (node.ChildNodes().OfType <TypeParameterListSyntax>().Any())
            {
                var listNode     = node.ChildNodes().OfType <TypeParameterListSyntax>().FirstOrDefault();
                var genericTypes = listNode
                                   .ChildNodes()
                                   .OfType <TypeParameterSyntax>()
                                   .Select(x => x.ChildTokens().FirstOrDefault(y => y.Kind() == SyntaxKind.IdentifierToken).ToString());

                defineName = $"{defineName}<{string.Join(", ", genericTypes)}>";
            }

            var startLength     = node.Span.Start;
            var endLength       = node.Span.End;
            var parentNamespace = GetNamespace(DefineKinds.Interface, startLength, endLength);

            var baseTypeInfos = new List <BaseTypeInfo>();

            // 継承元クラス、またはインターフェースがある場合
            if (node.ChildNodes().OfType <BaseListSyntax>().Any())
            {
                var listNode  = node.ChildNodes().OfType <BaseListSyntax>().FirstOrDefault();
                var baseTypes = listNode.ChildNodes().OfType <SimpleBaseTypeSyntax>();

                baseTypeInfos = GetBaseTypeInfos(baseTypes, parentNamespace);
            }

            UserDefinitions.Add(new UserDefinition
            {
                DefineKinds    = DefineKinds.Interface,
                IsPartial      = isPartial,
                Namespace      = parentNamespace,
                DefineName     = defineName,
                DefineFullName = $"{parentNamespace}.{defineName}",
                BaseTypeInfos  = baseTypeInfos,
                SourceFile     = SourceFile,
                StartLength    = startLength,
                EndLength      = endLength,
            });

            base.VisitInterfaceDeclaration(node);
        }
コード例 #3
0
        internal static InterfaceSpec AnalyzeInterfaceSyntaxTree(string napackName, string filename, InterfaceDeclarationSyntax interfaceNode)
        {
            InterfaceSpec interfaceSpec = new InterfaceSpec();

            interfaceSpec.Name = DocumentedElement.LoadFromSyntaxNode(interfaceNode);

            // Parse methods
            foreach (MethodDeclarationSyntax node in interfaceNode.ChildNodes().Where(node => node.IsKind(SyntaxKind.MethodDeclaration)))
            {
                interfaceSpec.Methods.Add(MethodSpec.LoadFromSyntaxNode(node));
            }

            // Parse properties
            foreach (PropertyDeclarationSyntax node in interfaceNode.ChildNodes().Where(node => node.IsKind(SyntaxKind.PropertyDeclaration)))
            {
                interfaceSpec.Properties.Add(PropertySpec.LoadFromSyntaxNode(node));
            }

            return(interfaceSpec);
        }
コード例 #4
0
		public override void VisitInterfaceDeclaration(InterfaceDeclarationSyntax node)
		{
			if (node.ShouldBeHidden()) return;

			if (node.ChildNodes().All(childNode => childNode is PropertyDeclarationSyntax || childNode is AttributeListSyntax))
			{
				// simple nested interface	
				var line = node.SyntaxTree.GetLineSpan(node.Span).StartLinePosition.Line;
				var walker = new CodeWithDocumentationWalker(0, line);
				walker.Visit(node);
				this.Blocks.AddRange(walker.Blocks);
			}
		}
コード例 #5
0
        public override void VisitInterfaceDeclaration(InterfaceDeclarationSyntax node)
        {
            if (node.ShouldBeHidden())
            {
                return;
            }

            if (node.ChildNodes().All(childNode => childNode.IsKind(SyntaxKind.PropertyDeclaration) ||
                                      childNode.IsKind(SyntaxKind.AttributeList)))
            {
                // simple nested interface
                AddNestedType(node);
            }
        }
コード例 #6
0
        public override void VisitInterfaceDeclaration(InterfaceDeclarationSyntax node)
        {
            if (node.ShouldBeHidden())
            {
                return;
            }

            if (node.ChildNodes().All(childNode => childNode is PropertyDeclarationSyntax || childNode is AttributeListSyntax))
            {
                // simple nested interface
                var line   = node.SyntaxTree.GetLineSpan(node.Span).StartLinePosition.Line;
                var walker = new CodeWithDocumentationWalker(0, line);
                walker.Visit(node);
                this.Blocks.AddRange(walker.Blocks);
            }
        }
コード例 #7
0
        InterfaceRenderInformation renderInterface(InterfaceDeclarationSyntax interfaceDecl)
        {
            var ret = new InterfaceRenderInformation();

            ret.isRoutableViewModel = interfaceDecl.BaseListOpt.Types.Any(x => x.PlainName == "IRoutableViewModel") ? this : null;
            ret.definition = chompedString(interfaceDecl.ToString().Replace("[Once]", ""));
            ret.interfaceName = chompedString(interfaceDecl.Identifier.ValueText);
            ret.implClassName = ret.interfaceName.Substring(1); // Skip the 'I'

            var children = interfaceDecl.ChildNodes().Skip(1);

            ret.properties = children.Select(renderPropertyDeclaration).ToArray();
            ret.onceProperties = ret.properties.Where(x => x.onceProp != null).Select(x => x.onceProp).ToArray();
            return ret;
        }
コード例 #8
0
ファイル: CSToUL.cs プロジェクト: xiongfang/UL
        void ExportInterface(InterfaceDeclarationSyntax c)
        {
            string name      = "";
            string nameSpace = "";

            NamespaceDeclarationSyntax namespaceDeclarationSyntax = c.Parent as NamespaceDeclarationSyntax;

            if (namespaceDeclarationSyntax != null)
            {
                nameSpace = namespaceDeclarationSyntax.Name.ToString();
            }
            else
            {
                nameSpace = ModelData.GloableNamespaceName;
            }
            name = c.Identifier.Text;



            if (step == ECompilerStet.ScanType)
            {
                type_list.Add(new ULTypeInfo());
                types.Push(type_list[type_list.Count - 1]);

                currentType.Namespace   = nameSpace;
                currentType.Name        = name;
                currentType.IsInterface = true;
                ModelData.UpdateType(currentType);
            }
            else
            {
                types.Push(ModelData.FindTypeByFullName(nameSpace + "." + name));
            }

            ////导出所有变量
            //var virableNodes = c.ChildNodes().OfType<BaseFieldDeclarationSyntax>();
            //foreach (var v in virableNodes)
            //{
            //    ExportVariable(v);
            //}

            //导出所有属性
            var propertyNodes = c.ChildNodes().OfType <BasePropertyDeclarationSyntax>();

            foreach (var v in propertyNodes)
            {
                ExportProperty(v);
            }


            //导出所有方法
            var funcNodes = c.ChildNodes().OfType <BaseMethodDeclarationSyntax>();

            foreach (var f in funcNodes)
            {
                ExportMethod(f);
            }

            var operatorNodes = c.ChildNodes().OfType <OperatorDeclarationSyntax>();

            foreach (var f in operatorNodes)
            {
                //ExportOperator(f, type);
            }
            var conversion_operatorNodes = c.ChildNodes().OfType <ConversionOperatorDeclarationSyntax>();

            foreach (var f in conversion_operatorNodes)
            {
                //ExportConversionOperator(f, type);
            }

            types.Pop();
        }
コード例 #9
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="node">対象Node</param>
        /// <param name="semanticModel">対象ソースのsemanticModel</param>
        /// <param name="parent">親IAnalyzeItem</param>
        /// <param name="container">イベントコンテナ</param>
        public ItemInterface(InterfaceDeclarationSyntax node, SemanticModel semanticModel, IAnalyzeItem parent, EventContainer container) : base(parent, node, semanticModel, container)
        {
            ItemType = ItemTypes.Interface;

            var declaredSymbol = semanticModel.GetDeclaredSymbol(node);

            // インターフェース設定
            if (node.BaseList != null)
            {
                // インターフェース
                foreach (var interfaceInfo in declaredSymbol.AllInterfaces)
                {
                    Interfaces.Add(getExpressionList(interfaceInfo));

                    // スーパーインタフェースのメンバーを追加する
                    SetBaseMembers(interfaceInfo);
                }

                // 対象をList<IExpression>に格納する
                List <IExpression> getExpressionList(INamedTypeSymbol target)
                {
                    var result = new List <IExpression>();

                    var displayParts = target.ToDisplayParts(SymbolDisplayFormat.MinimallyQualifiedFormat);

                    foreach (var part in displayParts)
                    {
                        // スペースの場合は型設定に含めない
                        if (part.Kind == SymbolDisplayPartKind.Space)
                        {
                            continue;
                        }

                        var name = Expression.GetSymbolName(part, true);
                        var type = Expression.GetSymbolTypeName(part.Symbol);
                        if (part.Symbol != null)
                        {
                            type = part.Symbol.GetType().Name;
                            if (part.Kind == SymbolDisplayPartKind.ClassName || part.Kind == SymbolDisplayPartKind.InterfaceName)
                            {
                                // 外部ファイル参照イベント発行
                                RaiseOtherFileReferenced(node, part.Symbol);
                            }
                        }

                        result.Add(new Expression(name, type));
                    }

                    return(result);
                }
            }

            // ジェネリックタイプ
            if (declaredSymbol.TypeParameters.Any())
            {
                var types = declaredSymbol.TypeParameters.Select(item => item.Name);
                GenericTypes.AddRange(types);
            }

            // メンバ
            foreach (var childSyntax in node.ChildNodes())
            {
                var memberResult = ItemFactory.Create(childSyntax, semanticModel, container, this);
                if (memberResult != null)
                {
                    Members.Add(memberResult);
                }
            }
        }
コード例 #10
0
        private Interface TraverseInterface(InterfaceDeclarationSyntax ids)
        {
            Interface retInterface = new Interface();

            if (ids.HasLeadingTrivia)
            {
                SetOuterComments(retInterface, ids.GetLeadingTrivia().ToFullString());
            }

            if (ids.HasTrailingTrivia)
            {
                SetInnerComments(retInterface, ids.GetTrailingTrivia().ToFullString());
            }

            foreach (SyntaxToken st in ids.Modifiers)
            {
                string modifier = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(st.ValueText);
                Encapsulation encap;
                Qualifiers qual;
                if (System.Enum.TryParse<Encapsulation>(modifier, out encap))
                {
                    retInterface.Encapsulation.Add(encap);
                }
                else if (System.Enum.TryParse<Qualifiers>(modifier, out qual))
                {
                    retInterface.Qualifiers.Add(qual);
                }
            }
            var accessVarsDecl = from aAccessVarsDecl in ids.ChildNodes().OfType<LocalDeclarationStatementSyntax>() select aAccessVarsDecl;
            foreach (LocalDeclarationStatementSyntax ldss in accessVarsDecl)
            {
                Method tempMethod = TransverseAccessVars(ldss);
                retInterface.Fields.AddRange(tempMethod.AccessedVariables);
                //retInterface.Methods.AddRange(tempMethod.InvokedMethods);
            }
            var interfaces = from aInterface in ids.ChildNodes().OfType<InterfaceDeclarationSyntax>() select aInterface;
            foreach (InterfaceDeclarationSyntax ids2 in interfaces)
            {
                Interface tempInterface = TraverseInterface(ids2);
                retInterface.InheritsInterfaces.Add(tempInterface);
            }
            retInterface.Name = ids.Identifier.ValueText;
            var methods = from aMethod in ids.ChildNodes().OfType<MethodDeclarationSyntax>() select aMethod;
            foreach (MethodDeclarationSyntax mds in methods)
            {
                Method tempMethod = TransverseMethods(mds);
                retInterface.Fields.AddRange(tempMethod.AccessedVariables);
                retInterface.Methods.Add(tempMethod);
            }
            //public List<string> InheritsStrings { get; set; }
            //public List<Property> Properties { get; set; }
            return retInterface;
        }