()
| 2845 | } |
| 2846 | |
| 2847 | func (node *SourceFile) computeDeclarationMap() map[string][]*Node { |
| 2848 | result := make(map[string][]*Node) |
| 2849 | |
| 2850 | addDeclaration := func(declaration *Node) { |
| 2851 | name := GetDeclarationName(declaration) |
| 2852 | if name != "" { |
| 2853 | result[name] = append(result[name], declaration) |
| 2854 | } |
| 2855 | } |
| 2856 | |
| 2857 | var visit func(*Node) bool |
| 2858 | visit = func(node *Node) bool { |
| 2859 | switch node.Kind { |
| 2860 | case KindFunctionDeclaration, KindFunctionExpression, KindMethodDeclaration, KindMethodSignature: |
| 2861 | declarationName := GetDeclarationName(node) |
| 2862 | if declarationName != "" { |
| 2863 | declarations := result[declarationName] |
| 2864 | var lastDeclaration *Node |
| 2865 | if len(declarations) != 0 { |
| 2866 | lastDeclaration = declarations[len(declarations)-1] |
| 2867 | } |
| 2868 | // Check whether this declaration belongs to an "overload group". |
| 2869 | if lastDeclaration != nil && node.Parent == lastDeclaration.Parent && node.Symbol() == lastDeclaration.Symbol() { |
| 2870 | // Overwrite the last declaration if it was an overload and this one is an implementation. |
| 2871 | if node.Body() != nil && lastDeclaration.Body() == nil { |
| 2872 | declarations[len(declarations)-1] = node |
| 2873 | } |
| 2874 | } else { |
| 2875 | result[declarationName] = append(result[declarationName], node) |
| 2876 | } |
| 2877 | } |
| 2878 | node.ForEachChild(visit) |
| 2879 | case KindClassDeclaration, KindClassExpression, KindInterfaceDeclaration, KindTypeAliasDeclaration, KindEnumDeclaration, KindModuleDeclaration, |
| 2880 | KindImportEqualsDeclaration, KindImportClause, KindNamespaceImport, KindGetAccessor, KindSetAccessor, KindTypeLiteral: |
| 2881 | addDeclaration(node) |
| 2882 | node.ForEachChild(visit) |
| 2883 | case KindImportSpecifier, KindExportSpecifier: |
| 2884 | if node.PropertyName() != nil { |
| 2885 | addDeclaration(node) |
| 2886 | } |
| 2887 | case KindParameter: |
| 2888 | // Only consider parameter properties |
| 2889 | if !HasSyntacticModifier(node, ModifierFlagsParameterPropertyModifier) { |
| 2890 | break |
| 2891 | } |
| 2892 | fallthrough |
| 2893 | case KindVariableDeclaration, KindBindingElement: |
| 2894 | name := node.Name() |
| 2895 | if name != nil { |
| 2896 | if IsBindingPattern(name) { |
| 2897 | node.Name().ForEachChild(visit) |
| 2898 | } else { |
| 2899 | if node.Initializer() != nil { |
| 2900 | visit(node.Initializer()) |
| 2901 | } |
| 2902 | addDeclaration(node) |
| 2903 | } |
| 2904 | } |
no test coverage detected