** * Declares a Symbol for the node and adds it to symbols. Reports errors for conflicting identifier names. * @param symbolTable - The symbol table which node will be added to. * @param parent - node's parent declaration. * @param node - The declaration to be added to the symbol table * @param
(node *ast.Node)
| 2556 | */ |
| 2557 | |
| 2558 | func GetContainerFlags(node *ast.Node) ContainerFlags { |
| 2559 | switch node.Kind { |
| 2560 | case ast.KindClassExpression, ast.KindClassDeclaration, ast.KindEnumDeclaration, ast.KindObjectLiteralExpression, ast.KindTypeLiteral, |
| 2561 | ast.KindJsxAttributes: |
| 2562 | return ContainerFlagsIsContainer |
| 2563 | case ast.KindInterfaceDeclaration: |
| 2564 | return ContainerFlagsIsContainer | ContainerFlagsIsInterface |
| 2565 | case ast.KindModuleDeclaration, ast.KindTypeAliasDeclaration, ast.KindJSTypeAliasDeclaration, ast.KindMappedType, ast.KindIndexSignature: |
| 2566 | return ContainerFlagsIsContainer | ContainerFlagsHasLocals |
| 2567 | case ast.KindSourceFile: |
| 2568 | return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals |
| 2569 | case ast.KindGetAccessor, ast.KindSetAccessor, ast.KindMethodDeclaration: |
| 2570 | if ast.IsObjectLiteralOrClassExpressionMethodOrAccessor(node) { |
| 2571 | return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsIsObjectLiteralOrClassExpressionMethodOrAccessor | ContainerFlagsIsThisContainer |
| 2572 | } |
| 2573 | fallthrough |
| 2574 | case ast.KindConstructor, ast.KindFunctionDeclaration, ast.KindClassStaticBlockDeclaration: |
| 2575 | return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsIsThisContainer |
| 2576 | case ast.KindMethodSignature, ast.KindCallSignature, ast.KindFunctionType, ast.KindConstructSignature, ast.KindConstructorType: |
| 2577 | return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsPropagatesThisKeyword |
| 2578 | case ast.KindFunctionExpression: |
| 2579 | return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsIsFunctionExpression | ContainerFlagsIsThisContainer |
| 2580 | case ast.KindArrowFunction: |
| 2581 | return ContainerFlagsIsContainer | ContainerFlagsIsControlFlowContainer | ContainerFlagsHasLocals | ContainerFlagsIsFunctionLike | ContainerFlagsIsFunctionExpression | ContainerFlagsPropagatesThisKeyword |
| 2582 | case ast.KindModuleBlock: |
| 2583 | return ContainerFlagsIsControlFlowContainer |
| 2584 | case ast.KindPropertyDeclaration: |
| 2585 | if node.Initializer() != nil { |
| 2586 | return ContainerFlagsIsControlFlowContainer | ContainerFlagsIsThisContainer |
| 2587 | } else { |
| 2588 | return ContainerFlagsNone |
| 2589 | } |
| 2590 | case ast.KindCatchClause, ast.KindForStatement, ast.KindForInStatement, ast.KindForOfStatement, ast.KindCaseBlock: |
| 2591 | return ContainerFlagsIsBlockScopedContainer | ContainerFlagsHasLocals |
| 2592 | case ast.KindBlock: |
| 2593 | if ast.IsFunctionLike(node.Parent) || ast.IsClassStaticBlockDeclaration(node.Parent) { |
| 2594 | return ContainerFlagsNone |
| 2595 | } else { |
| 2596 | return ContainerFlagsIsBlockScopedContainer | ContainerFlagsHasLocals |
| 2597 | } |
| 2598 | } |
| 2599 | return ContainerFlagsNone |
| 2600 | } |
| 2601 | |
| 2602 | func isNarrowingExpression(expr *ast.Node) bool { |
| 2603 | switch expr.Kind { |
no test coverage detected