@Override public void visitEnum(String name, String desc, String value) { getSymbol(desc).members().lookup(value).stream() .filter(symbol -> symbol.isKind(JavaSymbol.VAR)) .forEach(valuesList::add); }
@Override public void visitEnum(String name, String desc, String value) { getSymbol(desc).members().lookup(value).stream() .filter(symbol -> symbol.isKind(JavaSymbol.VAR)) .forEach(valuesList::add); }
private void addSymbolAsValue(String name, String value, JavaSymbol.TypeJavaSymbol sym) { sym.members().lookup(value).stream() .filter(symbol -> symbol.isKind(JavaSymbol.VAR)) .forEach(symbol -> addValue(name, symbol)); }
@Nullable private MethodJavaSymbol overriddenSymbolFrom(ClassJavaType classType) { if (classType.isUnknown()) { return Symbols.unknownMethodSymbol; } boolean unknownFound = false; List<JavaSymbol> symbols = classType.getSymbol().members().lookup(name); for (JavaSymbol overrideSymbol : symbols) { if (overrideSymbol.isKind(JavaSymbol.MTH) && !overrideSymbol.isStatic()) { MethodJavaSymbol methodJavaSymbol = (MethodJavaSymbol) overrideSymbol; if (canOverride(methodJavaSymbol)) { Boolean overriding = checkOverridingParameters(methodJavaSymbol, classType); if (overriding == null) { if (!unknownFound) { unknownFound = true; } } else if (overriding) { return methodJavaSymbol; } } } } if (unknownFound) { return Symbols.unknownMethodSymbol; } return null; }
/** * Finds field with given name. */ private Resolution findField(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { Resolution bestSoFar = unresolved(); for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.VAR) { return resolveField(env, site, c, symbol); } } Resolution resolution; if (c.getSuperclass() != null) { resolution = findField(env, site, name, c.getSuperclass().symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { resolution.type = typeSubstitutionSolver.applySiteSubstitution(resolution.type(), c.getSuperclass()); bestSoFar = resolution; } } for (JavaType interfaceType : c.getInterfaces()) { resolution = findField(env, site, name, interfaceType.symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { bestSoFar = resolution; } } return bestSoFar; }
private JavaSymbol findMemberType(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { JavaSymbol bestSoFar = symbolNotFound; for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return isAccessible(env, site, symbol) ? symbol : new AccessErrorJavaSymbol(symbol, symbols.unknownType); } } if (c.getSuperclass() != null) { JavaSymbol symbol = findMemberType(env, site, name, c.getSuperclass().symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } for (JavaType interfaceType : c.getInterfaces()) { JavaSymbol symbol = findMemberType(env, site, name, interfaceType.symbol); if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } return bestSoFar; }
@Override public void visitIdentifier(IdentifierTree tree) { if (JavaPunctuator.STAR.getValue().equals(tree.name())) { //star import : we save the current symbol if (isStatic) { env.staticStarImports.enter(currentSymbol); } else { env.starImports.enter(currentSymbol); } //we set current symbol to not found to do not put it in named import scope. currentSymbol = new Resolve.JavaSymbolNotFound(); } else { if (currentSymbol.kind == JavaSymbol.PCK) { currentSymbol = resolve.findIdentInPackage(currentSymbol, tree.name(), JavaSymbol.PCK | JavaSymbol.TYP); resolved = Collections.emptyList(); } else if (currentSymbol.kind == JavaSymbol.TYP) { resolved = ((JavaSymbol.TypeJavaSymbol) currentSymbol).members().lookup(tree.name()); currentSymbol = resolve.findIdentInType(env, (JavaSymbol.TypeJavaSymbol) currentSymbol, tree.name(), JavaSymbol.TYP | JavaSymbol.VAR).symbol(); } else { //Site symbol is not found so we won't be able to resolve the import. currentSymbol = new Resolve.JavaSymbolNotFound(); resolved = Collections.emptyList(); } } }
@Override public List<JavaSymbol> lookup(String name) { List<JavaSymbol> symbolsList = Lists.newArrayList(); for (JavaSymbol site : symbols.values()) { // site is a package, try to load referenced type. if ((site.kind & JavaSymbol.PCK) != 0) { JavaSymbol symbol = bytecodeCompleter.loadClass(bytecodeCompleter.formFullName(name, site)); if (symbol.kind < JavaSymbol.ERRONEOUS) { symbolsList.add(symbol); } } // site is a type, try to find a matching type or field if ((site.kind & JavaSymbol.TYP) != 0 && site.kind < JavaSymbol.ERRONEOUS) { List<JavaSymbol> resolved = ((JavaSymbol.TypeJavaSymbol) site).members().lookup(name); resolved.stream() // TODO check accessibility // TODO factorize with static named import ? .filter(symbol -> symbol.kind < JavaSymbol.ERRONEOUS && Flags.isFlagged(symbol.flags, Flags.STATIC)) .forEach(symbolsList::add); } } return symbolsList; } }
@Nullable private Boolean overridesFromSymbol(JavaType.ClassJavaType classType) { Boolean result = false; if (classType.isTagged(JavaType.UNKNOWN)) { return null; } List<JavaSymbol> symbols = classType.getSymbol().members().lookup(name); for (JavaSymbol overrideSymbol : symbols) { if (overrideSymbol.isKind(JavaSymbol.MTH) && canOverride((MethodJavaSymbol) overrideSymbol)) { Boolean isOverriding = isOverriding((MethodJavaSymbol) overrideSymbol, classType); if (isOverriding == null) { result = null; } else if (BooleanUtils.isTrue(isOverriding)) { return true; } } } return result; }
@Override public Collection<org.sonar.plugins.java.api.semantic.Symbol> memberSymbols() { return Lists.<org.sonar.plugins.java.api.semantic.Symbol>newArrayList(members().scopeSymbols()); }
@Override public Collection<Symbol> memberSymbols() { return Lists.<Symbol>newArrayList(members().scopeSymbols()); }
@Override public Collection<org.sonar.plugins.java.api.semantic.Symbol> lookupSymbols(String name) { return Lists.<org.sonar.plugins.java.api.semantic.Symbol>newArrayList(members().lookup(name)); }
@Override public Collection<org.sonar.plugins.java.api.semantic.Symbol> lookupSymbols(String name) { return Lists.<org.sonar.plugins.java.api.semantic.Symbol>newArrayList(members().lookup(name)); }
@Override public Collection<Symbol> lookupSymbols(String name) { return Lists.<Symbol>newArrayList(members().lookup(name)); }
@Override public Collection<Symbol> memberSymbols() { return Lists.<Symbol>newArrayList(members().scopeSymbols()); }
@Override public Collection<Symbol> lookupSymbols(String name) { return Lists.<Symbol>newArrayList(members().lookup(name)); }
@Override public void visitEnum(String name, String desc, String value) { List<JavaSymbol> lookup = getSymbol(desc).members().lookup(value); for (JavaSymbol symbol : lookup) { if (symbol.isKind(JavaSymbol.VAR)) { addValue(name, symbol); } } }
@Override public Collection<org.sonar.plugins.java.api.semantic.Symbol> memberSymbols() { return Lists.<org.sonar.plugins.java.api.semantic.Symbol>newArrayList(members().scopeSymbols()); }
@Override public void visitEnum(String name, String desc, String value) { List<JavaSymbol> lookup = getSymbol(desc).members().lookup(value); for (JavaSymbol symbol : lookup) { if (symbol.isKind(JavaSymbol.VAR)) { addValue(name, symbol); } } }
private void addSymbolAsValue(String name, String value, JavaSymbol.TypeJavaSymbol sym) { sym.members().lookup(value).stream() .filter(symbol -> symbol.isKind(JavaSymbol.VAR)) .forEach(symbol -> addValue(name, symbol)); }