in nullaway/src/main/java/com/uber/nullaway/NullAway.java [2424:2498]
private FieldInitEntities collectEntities(ClassTree tree, VisitorState state) {
Symbol.ClassSymbol classSymbol = ASTHelpers.getSymbol(tree);
Set<Symbol> nonnullInstanceFields = new LinkedHashSet<>();
Set<Symbol> nonnullStaticFields = new LinkedHashSet<>();
List<BlockTree> instanceInitializerBlocks = new ArrayList<>();
List<BlockTree> staticInitializerBlocks = new ArrayList<>();
Set<MethodTree> constructors = new LinkedHashSet<>();
Set<MethodTree> instanceInitializerMethods = new LinkedHashSet<>();
Set<MethodTree> staticInitializerMethods = new LinkedHashSet<>();
// we assume getMembers() returns members in the same order as the declarations
for (Tree memberTree : tree.getMembers()) {
if (TreeUtils.isClassTree(memberTree)) {
// do nothing
continue;
}
switch (memberTree.getKind()) {
case METHOD:
// check if it is a constructor or an @Initializer method
MethodTree methodTree = (MethodTree) memberTree;
Symbol.MethodSymbol symbol = ASTHelpers.getSymbol(methodTree);
if (isConstructor(methodTree)) {
constructors.add(methodTree);
} else if (isInitializerMethod(state, symbol)) {
if (symbol.isStatic()) {
staticInitializerMethods.add(methodTree);
} else {
instanceInitializerMethods.add(methodTree);
}
}
break;
case VARIABLE:
// field declaration
VariableTree varTree = (VariableTree) memberTree;
Symbol fieldSymbol = ASTHelpers.getSymbol(varTree);
if (fieldSymbol.type.isPrimitive()
|| skipFieldInitializationCheckingDueToAnnotation(fieldSymbol)) {
continue;
}
if (varTree.getInitializer() != null) {
// note that we check that the initializer does the right thing in
// matchVariable()
continue;
}
if (isStatic(fieldSymbol)) {
nonnullStaticFields.add(fieldSymbol);
} else {
nonnullInstanceFields.add(fieldSymbol);
}
break;
case BLOCK:
// initializer block
BlockTree blockTree = (BlockTree) memberTree;
if (blockTree.isStatic()) {
staticInitializerBlocks.add(blockTree);
} else {
instanceInitializerBlocks.add(blockTree);
}
break;
default:
throw new RuntimeException(
memberTree.getKind().toString() + " " + state.getSourceForNode(memberTree));
}
}
return FieldInitEntities.create(
classSymbol,
ImmutableSet.copyOf(nonnullInstanceFields),
ImmutableSet.copyOf(nonnullStaticFields),
ImmutableList.copyOf(instanceInitializerBlocks),
ImmutableList.copyOf(staticInitializerBlocks),
ImmutableSet.copyOf(constructors),
ImmutableSet.copyOf(instanceInitializerMethods),
ImmutableSet.copyOf(staticInitializerMethods));
}