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); }
internal static ClassSpec AnalyzeClassSyntaxTree(string napackName, string filename, ClassDeclarationSyntax classNode) { ClassSpec classSpec = new ClassSpec(); classSpec.Name = DocumentedElement.LoadFromSyntaxNode(classNode); classSpec.IsAbstract = classNode.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.AbstractKeyword)); classSpec.IsStatic = classNode.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.StaticKeyword)); classSpec.IsSealed = classSpec.IsStatic || classNode.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.SealedKeyword)); // Parse classes recursively foreach (ClassDeclarationSyntax node in classNode.ChildNodes().Where(node => node.IsKind(SyntaxKind.ClassDeclaration))) { if (node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.PublicKeyword)) || (classSpec.ProtectedItemsConsideredPublic && node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.ProtectedKeyword)))) { // This recursion will exit because we aren't *compiling* the code, but merely parsing it. classSpec.PublicClasses.Add(AnalyzeClassSyntaxTree(napackName, filename, node)); } } // Parse methods foreach (MethodDeclarationSyntax node in classNode.ChildNodes().Where(node => node.IsKind(SyntaxKind.MethodDeclaration))) { if (node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.PublicKeyword)) || (classSpec.ProtectedItemsConsideredPublic && node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.ProtectedKeyword)))) { classSpec.PublicMethods.Add(MethodSpec.LoadFromSyntaxNode(node)); } } // Parse constructors foreach (ConstructorDeclarationSyntax node in classNode.ChildNodes().Where(node => node.IsKind(SyntaxKind.ConstructorDeclaration))) { if (node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.PublicKeyword)) || (classSpec.ProtectedItemsConsideredPublic && node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.ProtectedKeyword)))) { classSpec.PublicConstructors.Add(ConstructorSpec.LoadFromSyntaxNode(node)); } } // Parse fields foreach (FieldDeclarationSyntax node in classNode.ChildNodes().Where(node => node.IsKind(SyntaxKind.FieldDeclaration))) { if (node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.PublicKeyword)) || (classSpec.ProtectedItemsConsideredPublic && node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.ProtectedKeyword)))) { classSpec.PublicFields.Add(FieldSpec.LoadFromSyntaxNode(node)); } } // Parse properties foreach (PropertyDeclarationSyntax node in classNode.ChildNodes().Where(node => node.IsKind(SyntaxKind.PropertyDeclaration))) { if (node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.PublicKeyword)) || (classSpec.ProtectedItemsConsideredPublic && node.Modifiers.Any(modifier => modifier.IsKind(SyntaxKind.ProtectedKeyword)))) { classSpec.PublicProperties.Add(PropertySpec.LoadFromSyntaxNode(node)); } } return(classSpec); }