diff --git a/framework/src/main/java/org/checkerframework/framework/stub/AnnotationFileParser.java b/framework/src/main/java/org/checkerframework/framework/stub/AnnotationFileParser.java index ee04a2018c25..8b6aac1c4a59 100644 --- a/framework/src/main/java/org/checkerframework/framework/stub/AnnotationFileParser.java +++ b/framework/src/main/java/org/checkerframework/framework/stub/AnnotationFileParser.java @@ -2407,6 +2407,25 @@ private void processFakeOverride( return findFieldElement(typeElt, enumConstName, astNode); } + /** Cache all the methods that are in a TypeElement. */ + private final Map> methodsInTypeElementCache = + CollectionsPlume.createLruCache(100); + + /** + * Determine all the methods that are in a TypeElement, caching the result. + * + * @param typeElt the type element + * @return the methods in that type element + */ + private List methodsInTypeElement(TypeElement typeElt) { + List res = methodsInTypeElementCache.get(typeElt); + if (res == null) { + res = ElementFilter.methodsIn(typeElt.getEnclosedElements()); + methodsInTypeElementCache.put(typeElt, res); + } + return res; + } + /** * Looks for a method element in {@code typeElt} that has the same name and formal parameter * types as {@code methodDecl}. Returns null, and possibly issues a warning, if no such method @@ -2428,7 +2447,7 @@ private void processFakeOverride( int wantedMethodParams = (methodDecl.getParameters() == null) ? 0 : methodDecl.getParameters().size(); String wantedMethodString = AnnotationFileUtil.toString(methodDecl); - for (ExecutableElement method : ElementFilter.methodsIn(typeElt.getEnclosedElements())) { + for (ExecutableElement method : methodsInTypeElement(typeElt)) { if (wantedMethodParams == method.getParameters().size() && wantedMethodName.contentEquals(method.getSimpleName().toString()) && ElementUtils.getSimpleSignature(method).equals(wantedMethodString)) { @@ -2455,8 +2474,7 @@ private void processFakeOverride( "method " + wantedMethodString + " not found in type " + typeElt); if (debugAnnotationFileParser) { stubDebug(" methods of %s:", typeElt); - for (ExecutableElement method : - ElementFilter.methodsIn(typeElt.getEnclosedElements())) { + for (ExecutableElement method : methodsInTypeElement(typeElt)) { stubDebug(" %s", method); } }