public Symbol getEnclosingClass(Tree tree) { return getEnv(tree).enclosingClass; }
private void enterSymbol(JavaSymbol symbol, ImportTree tree) { env.namedImports.enter(symbol); //FIXME We add all symbols to named Imports for static methods, but only the first one will be resolved as we don't handle arguments. //FIXME That is why we only add the first symbol so we resolve references at best for now. //add to semantic model only the first symbol. //twice the same import : ignore the duplication JLS8 7.5.1. if (semanticModel.getSymbol(tree) == null && semanticModel.getTree(symbol) == null) { semanticModel.associateSymbol(tree, symbol); } }
private void createNewEnvironment(Tree tree) { Scope scope = new Scope(env.scope); Resolve.Env newEnv = env.dup(); newEnv.scope = scope; env = newEnv; semanticModel.associateEnv(tree, env); }
private void enterSymbol(JavaSymbol symbol, ImportTree tree) { env.namedImports.enter(symbol); //FIXME We add all symbols to named Imports for static methods, but only the first one will be resolved as we don't handle arguments. //FIXME That is why we only add the first symbol so we resolve references at best for now. //add to semantic model only the first symbol. //twice the same import : ignore the duplication JLS8 7.5.1. if (semanticModel.getSymbol(tree) == null) { semanticModel.associateSymbol(tree, symbol); } }
private boolean isNotLoopLocalVar(AssignmentExpressionTree tree) { IdentifierTree idTree = getIdentifierTree(tree.variable()); Tree envTree = semanticModel.getTree(semanticModel.getEnv(idTree.symbol())); Tree loopTree = loopLevel.peek(); return envTree == null || !(envTree.equals(loopTree) || envTree.equals(loopStatement(loopTree))); }
private void createSymbol(IdentifierTree declaration, Tree tree) { org.sonar.plugins.java.api.semantic.Symbol semanticSymbol = semanticModel.getSymbol(tree); if (semanticSymbol == null) { semanticSymbol = Symbols.unknownSymbol; } createSymbol(declaration, semanticSymbol.usages()); }
@Override public void visitCompilationUnit(CompilationUnitTree tree) { JavaSymbol.PackageJavaSymbol compilationUnitPackage = symbols.defaultPackage; ExpressionTree packageName = tree.packageName(); if (packageName != null) { PackageResolverVisitor packageResolver = new PackageResolverVisitor(); packageName.accept(packageResolver); compilationUnitPackage = (JavaSymbol.PackageJavaSymbol) resolve.findIdentInPackage(compilationUnitPackage, packageResolver.packageName, JavaSymbol.PCK); semanticModel.associateSymbol(packageName, compilationUnitPackage); } compilationUnitPackage.members = new Scope(compilationUnitPackage); env = new Resolve.Env(); env.packge = compilationUnitPackage; env.scope = compilationUnitPackage.members; env.namedImports = new Scope(compilationUnitPackage); env.starImports = resolve.createStarImportScope(compilationUnitPackage); env.staticStarImports = resolve.createStaticStarImportScope(compilationUnitPackage); semanticModel.associateEnv(tree, env); super.visitCompilationUnit(tree); restoreEnvironment(tree); resolveImports(tree.imports()); completeSymbols(); }
semanticModel.saveEnv(symbol, env); for (TypeParameterTree typeParameterTree : tree.typeParameters()) { JavaSymbol.TypeVariableJavaSymbol typeVariableSymbol = new JavaSymbol.TypeVariableJavaSymbol(typeParameterTree.identifier().name(), symbol); classEnv.scope = symbol.members; env = classEnv; semanticModel.associateEnv(tree, env); scan(tree.modifiers());
@Override public void visitFile(@Nullable AstNode astNode) { semanticModel = null; if (astNode != null) { CompilationUnitTree tree = (CompilationUnitTree) astNode; if (isNotJavaLangOrSerializable()) { try { semanticModel = SemanticModel.createFor(tree, getProjectClasspath()); } catch (Exception e) { LOG.error("Unable to create symbol table for : " + getContext().getFile().getAbsolutePath(), e); return; } createSonarSymbolTable(tree); } else { SemanticModel.handleMissingTypes(tree); } JavaFileScannerContext context = new DefaultJavaFileScannerContext(tree, (SourceFile) getContext().peekSourceCode(), getContext().getFile(), semanticModel, analyseAccessors); for (JavaFileScanner scanner : scanners) { scanner.scanFile(context); } if (semanticModel != null) { // Close class loader after all the checks. semanticModel.done(); } } }
public static SemanticModel createFor(CompilationUnitTree tree, SquidClassLoader classLoader) { ParametrizedTypeCache parametrizedTypeCache = new ParametrizedTypeCache(); BytecodeCompleter bytecodeCompleter = new BytecodeCompleter(classLoader, parametrizedTypeCache); Symbols symbols = new Symbols(bytecodeCompleter); SemanticModel semanticModel = new SemanticModel(bytecodeCompleter); try { Resolve resolve = new Resolve(symbols, bytecodeCompleter, parametrizedTypeCache); TypeAndReferenceSolver typeAndReferenceSolver = new TypeAndReferenceSolver(semanticModel, symbols, resolve, parametrizedTypeCache); new FirstPass(semanticModel, symbols, resolve, parametrizedTypeCache, typeAndReferenceSolver).visitCompilationUnit(tree); typeAndReferenceSolver.visitCompilationUnit(tree); new LabelsVisitor(semanticModel).visitCompilationUnit(tree); } finally { handleMissingTypes(tree); } return semanticModel; }
if (isNotJavaLangOrSerializable(PackageUtils.packageName(tree.packageDeclaration(), "/"))) { try { semanticModel = SemanticModel.createFor(tree, classLoader); } catch (Exception e) { LOG.error("Unable to create symbol table for : " + currentFile.getAbsolutePath(), e); SemanticModel.handleMissingTypes(tree); scannerRunner.run(javaFileScannerContext); if (semanticModel != null) { classesNotFound.addAll(semanticModel.classesNotFound());
public static SemanticModel createFor(CompilationUnitTree tree, List<File> projectClasspath) { ParametrizedTypeCache parametrizedTypeCache = new ParametrizedTypeCache(); BytecodeCompleter bytecodeCompleter = new BytecodeCompleter(projectClasspath, parametrizedTypeCache); Symbols symbols = new Symbols(bytecodeCompleter); SemanticModel semanticModel = new SemanticModel(); semanticModel.bytecodeCompleter = bytecodeCompleter; semanticModel.createParentLink((JavaTree) tree); try { Resolve resolve = new Resolve(symbols, bytecodeCompleter, parametrizedTypeCache); TypeAndReferenceSolver typeAndReferenceSolver = new TypeAndReferenceSolver(semanticModel, symbols, resolve, parametrizedTypeCache); new FirstPass(semanticModel, symbols, resolve, parametrizedTypeCache, typeAndReferenceSolver).visitCompilationUnit(tree); typeAndReferenceSolver.visitCompilationUnit(tree); new LabelsVisitor(semanticModel).visitCompilationUnit(tree); } finally { handleMissingTypes(tree); } return semanticModel; }
private void enterSymbol(Tree tree, JavaSymbol symbol) { env.scope.enter(symbol); semanticModel.associateSymbol(tree, symbol); }
private void declareVariable(int flags, IdentifierTree identifierTree, VariableTreeImpl tree) { JavaSymbol.VariableJavaSymbol symbol = new JavaSymbol.VariableJavaSymbol(flags, identifierTree.name(), env.scope.owner); symbol.declaration = tree; enterSymbol(tree, symbol); symbol.completer = completer; uncompleted.add(symbol); tree.setSymbol(symbol); // Save current environment to be able to complete variable declaration later semanticModel.saveEnv(symbol, env); }
private void declareVariable(int flags, IdentifierTree identifierTree, VariableTreeImpl tree) { String name = identifierTree.name(); Object constantValue = semanticModel.constantValue(env.scope.owner, name); JavaSymbol.VariableJavaSymbol symbol = new JavaSymbol.VariableJavaSymbol(flags, name, env.scope.owner, constantValue); symbol.declaration = tree; enterSymbol(tree, symbol); symbol.completer = completer; uncompleted.add(symbol); tree.setSymbol(symbol); // Save current environment to be able to complete variable declaration later semanticModel.saveEnv(symbol, env); }
public static String printFile(String file, String bytecodePath) { final Parser p = JavaParser.createParser(Charsets.UTF_8); CompilationUnitTree cut = (CompilationUnitTree) p.parse(new File(file)); List<File> bytecodeFiles = Lists.newArrayList(); if (!bytecodePath.isEmpty()) { bytecodeFiles.add(new File(bytecodePath)); } SemanticModel semanticModel = SemanticModel.createFor(cut, bytecodeFiles); return PrinterVisitor.print(cut, semanticModel); } }
private void associateReference(IdentifierTree tree, JavaSymbol symbol) { if (symbol.kind < JavaSymbol.ERRONEOUS) { semanticModel.associateReference(tree, symbol); ((IdentifierTreeImpl) tree).setSymbol(symbol); symbol.addUsage(tree); } }
private boolean isNotLoopLocalVar(AssignmentExpressionTree tree) { IdentifierTree idTree = getIdentifierTree(tree.variable()); Tree envTree = semanticModel.getTree(semanticModel.getEnv(idTree.symbol())); Tree loopTree = loopLevel.peek(); return envTree == null || !(envTree.equals(loopTree) || envTree.equals(loopStatement(loopTree))); }
private void createSymbol(IdentifierTree declaration, Tree tree) { org.sonar.plugins.java.api.semantic.Symbol semanticSymbol = semanticModel.getSymbol(tree); if (semanticSymbol == null) { semanticSymbol = Symbols.unknownSymbol; } createSymbol(declaration, semanticSymbol.usages()); }
@Override public void visitCompilationUnit(CompilationUnitTree tree) { JavaSymbol.PackageJavaSymbol compilationUnitPackage = symbols.defaultPackage; PackageDeclarationTree packageDeclaration = tree.packageDeclaration(); if (packageDeclaration != null) { ExpressionTree packageName = packageDeclaration.packageName(); PackageResolverVisitor packageResolver = new PackageResolverVisitor(); packageName.accept(packageResolver); compilationUnitPackage = (JavaSymbol.PackageJavaSymbol) resolve.findIdentInPackage(compilationUnitPackage, packageResolver.packageName, JavaSymbol.PCK); semanticModel.associateSymbol(packageName, compilationUnitPackage); } compilationUnitPackage.members = new Scope(compilationUnitPackage); env = new Resolve.Env(); env.packge = compilationUnitPackage; env.scope = compilationUnitPackage.members; env.namedImports = new Scope.ImportScope(compilationUnitPackage); env.starImports = resolve.createStarImportScope(compilationUnitPackage); env.staticStarImports = resolve.createStaticStarImportScope(compilationUnitPackage); semanticModel.associateEnv(tree, env); scan(tree.types()); restoreEnvironment(tree); resolveImports(tree.imports()); completeSymbols(); }