@Override public void visitScript(ScriptTree tree) { nestingLevel = 0; super.visitScript(tree); }
@Override public void visitScript(ScriptTree tree) { stack.clear(); super.visitScript(tree); }
@Override public void visitScript(ScriptTree tree) { chainedIfStatements.clear(); super.visitScript(tree); }
@Override public void visitScript(ScriptTree tree) { jumpTargets.clear(); super.visitScript(tree); }
@Override public void visitScript(ScriptTree tree) { pattern = Pattern.compile(format); super.visitScript(tree); }
@Override public void visitScript(ScriptTree tree) { superInvocations.clear(); super.visitScript(tree); }
@Override public void visitScript(ScriptTree tree) { super.visitScript(tree); usedInCallExpression.clear(); usedInNewExpression.clear(); }
@Override public void visitScript(ScriptTree tree) { storageTypes.clear(); super.visitScript(tree); checkForIssues(); }
@Override public void visitScript(ScriptTree tree) { undeclaredIdentifiersByName.clear(); excludedNames.clear(); super.visitScript(tree); for (String name : undeclaredIdentifiersByName.keySet()) { List<IdentifierTree> identifiers = undeclaredIdentifiersByName.get(name); PreciseIssue issue = addIssue(identifiers.get(0), String.format(MESSAGE, name)); identifiers.subList(1, identifiers.size()).stream().forEach(issue::secondary); } }
@Override public void visitScript(ScriptTree tree) { selectors = new ArrayDeque<>(); startScopeBlock(); super.visitScript(tree); finishScopeBlock(); }
@Override public void visitScript(ScriptTree tree) { simpleImportsByModule = ArrayListMultimap.create(); typeOfImportsByModule = ArrayListMultimap.create(); typeImportsByModule = ArrayListMultimap.create(); super.visitScript(tree); checkImports(simpleImportsByModule); checkImports(typeOfImportsByModule); checkImports(typeImportsByModule); }
@Override public void visitScript(ScriptTree tree) { // initialization exceptedStatements = new HashSet<>(); // in many libraries the script starts with a ";". We raise no issue for such leading empty statement ModuleTree module = tree.items(); if (module != null && !module.items().isEmpty()) { except(module.items().get(0)); } super.visitScript(tree); }
@Override public void visitScript(ScriptTree tree) { ignoredSymbols = new HashSet<>(); super.visitScript(tree); for (Symbol letVariableSymbol : getContext().getSymbolModel().getSymbols(Kind.LET_VARIABLE)) { if (!ignoredSymbols.contains(letVariableSymbol)) { boolean isWritten = false; Usage declarationWithInit = null; for (Usage usage : letVariableSymbol.usages()) { if (usage.kind() == Usage.Kind.DECLARATION_WRITE) { declarationWithInit = usage; } else if (usage.isWrite()) { isWritten = true; } } if (declarationWithInit != null && !isWritten && letVariableSymbol.usages().size() > 1) { addIssue(declarationWithInit.identifierTree(), String.format(MESSAGE, letVariableSymbol.name())); } } } }
@Override public void visitScript(ScriptTree tree) { ignoredSymbols = new HashSet<>(); super.visitScript(tree); SymbolModel symbolModel = getContext().getSymbolModel(); for (Symbol symbol : symbolModel.getSymbols()) { if (ignoredSymbols.contains(symbol) || isFunctionExpression(symbol)) { continue; } Collection<Usage> usages = symbol.usages(); if (noUsages(usages) && !isGlobalOrCatchVariable(symbol) && !symbol.external()) { if (symbol.isVariable()) { raiseIssuesOnDeclarations(symbol, String.format(MESSAGE_FOR_VARIABLE, symbol.name())); } else if (symbol.is(Symbol.Kind.FUNCTION)) { raiseIssuesOnDeclarations(symbol, String.format(MESSAGE_FOR_FUNCTION, symbol.name())); } } } }