diff --git a/java-frontend/src/main/java/org/sonar/java/model/JSema.java b/java-frontend/src/main/java/org/sonar/java/model/JSema.java index 313ef260d2d..4045f8d1db5 100644 --- a/java-frontend/src/main/java/org/sonar/java/model/JSema.java +++ b/java-frontend/src/main/java/org/sonar/java/model/JSema.java @@ -56,7 +56,11 @@ public final class JSema implements Sema { } public JType type(ITypeBinding typeBinding) { - return types.computeIfAbsent(typeBinding, k -> new JType(this, JType.normalize(typeBinding))); + JType cached = types.get(typeBinding); + if (cached != null) { + return cached; + } + return types.computeIfAbsent(typeBinding, k -> new JType(this, JType.normalize(k))); } List types(ITypeBinding[] typeBindings) { @@ -74,31 +78,59 @@ public Symbol packageSymbol(@Nullable IPackageBinding packageBinding) { if (packageBinding == null) { return Symbol.ROOT_PACKAGE; } + JSymbol cached = symbols.get(packageBinding); + if (cached != null) { + return cached; + } return symbols.computeIfAbsent(packageBinding, k -> new JPackageSymbol(this, (IPackageBinding) k)); } public JTypeSymbol typeSymbol(ITypeBinding typeBinding) { + JTypeSymbol cached = (JTypeSymbol) symbols.get(typeBinding); + if (cached != null) { + return cached; + } return (JTypeSymbol) symbols.computeIfAbsent(typeBinding, k -> new JTypeSymbol(this, JType.normalize((ITypeBinding) k))); } public JMethodSymbol methodSymbol(IMethodBinding methodBinding) { + JMethodSymbol cached = (JMethodSymbol) symbols.get(methodBinding); + if (cached != null) { + return cached; + } return (JMethodSymbol) symbols.computeIfAbsent(methodBinding, k -> new JMethodSymbol(this, (IMethodBinding) k)); } public JInitializerBlockSymbol initializerBlockSymbol(JTypeSymbol owner) { - return initializerBlockSymbols.computeIfAbsent(owner, k -> new JInitializerBlockSymbol(owner, false)); + JInitializerBlockSymbol cached = initializerBlockSymbols.get(owner); + if (cached != null) { + return cached; + } + return initializerBlockSymbols.computeIfAbsent(owner, k -> new JInitializerBlockSymbol(k, false)); } public JInitializerBlockSymbol staticInitializerBlockSymbol(JTypeSymbol owner) { - return staticInitializerBlockSymbols.computeIfAbsent(owner, k -> new JInitializerBlockSymbol(owner, true)); + JInitializerBlockSymbol cached = staticInitializerBlockSymbols.get(owner); + if (cached != null) { + return cached; + } + return staticInitializerBlockSymbols.computeIfAbsent(owner, k -> new JInitializerBlockSymbol(k, true)); } public JVariableSymbol variableSymbol(IVariableBinding variableBinding) { + JVariableSymbol cached = (JVariableSymbol) symbols.get(variableBinding); + if (cached != null) { + return cached; + } return (JVariableSymbol) symbols.computeIfAbsent(variableBinding, k -> new JVariableSymbol(this, (IVariableBinding) k)); } JSymbolMetadata.JAnnotationInstance annotation(IAnnotationBinding annotationBinding) { + JSymbolMetadata.JAnnotationInstance cached = annotations.get(annotationBinding); + if (cached != null) { + return cached; + } return annotations.computeIfAbsent(annotationBinding, k -> new JSymbolMetadata.JAnnotationInstance(this, k)); } @@ -117,6 +149,10 @@ static IBinding declarationBinding(IBinding binding) { @Override public Type getClassType(String fullyQualifiedName) { + Type cached = nameToTypeCache.get(fullyQualifiedName); + if (cached != null) { + return cached; + } return nameToTypeCache.computeIfAbsent(fullyQualifiedName, t -> { ITypeBinding typeBinding = resolveType(t); return typeBinding != null ? type(typeBinding) : Type.UNKNOWN;