void (String classFileName, Collection<String> sources, ClassReader cr, boolean isGenerated) { synchronized (myLock) { final int classFileNameS = myContext.get(classFileName); final ClassFileRepr result = new ClassfileAnalyzer(myContext).analyze(classFileNameS, cr, isGenerated); if (result != null) { // since java9 'repr' can represent either a class or a compiled module-info.java final int className = result.name; if (result instanceof ClassRepr) { final ClassRepr classRepr = (ClassRepr)result; final String classNameStr = myContext.getValue(className); if (addConstantUsages(classRepr, myConstantRefs.remove(classNameStr))) { // Important: should register constants before imports, because imports can produce additional // field references too and addConstantUsages may return false in this case classRepr.setHasInlinedConstants(true); } final Pair<Collection<String>, Collection<String>> imports = myImportRefs.remove(classNameStr); if (imports != null) { addImportUsages(classRepr, imports.getFirst(), imports.getSecond()); } } for (String sourceFileName : sources) { String relative = myRelativizer.toRelative(sourceFileName); myClassToRelativeSourceFilePath.put(className, relative); myRelativeSourceFilePathToClasses.put(relative, result); } if (result instanceof ClassRepr) { for (final TypeRepr.ClassType s : ((ClassRepr)result).getSuperTypes()) { myClassToSubclasses.put(s.className, className); } } for (final UsageRepr.Usage u : result.getUsages()) { final int owner = u.getOwner(); if (owner != className) { myClassToClassDependency.put(owner, className); } } } } }