/**
   * Walks to the enclosing type's simple names and applies naming convention. This shortcut/fix
   * shows deficiency of model (it's probably more complicated than needed).
   *
   * @return enclosing immutable name
   */
  @Value.Lazy
  String typeImmutableEnclosingSimpleName() {
    DeclaringType declaringType = protoclass().enclosingOf().get();
    String enclosingSimpleName = declaringType.element().getSimpleName().toString();
    String enclosingRawName = names().rawFromAbstract(enclosingSimpleName);
    // Here we checking for having both enclosing and value
    // if we had protoclass it would be kind().isEnclosing() && kind().isValue()
    Naming naming =
        declaringType.isImmutable()
            ? names().namings.typeImmutable
            : names().namings.typeImmutableEnclosing;

    return naming.apply(enclosingRawName);
  }
 @Nullable
 private String getFromSourceImports(String resolvable) {
   if (sourceClassesImports == null) {
     sourceClassesImports = declaringType.associatedTopLevel().sourceImports().classes;
   }
   return sourceClassesImports.get(resolvable);
 }
 @Nullable
 private String getFromSourceImports(String resolvable) {
   if (sourceClassesImports == null) {
     sourceClassesImports = Lists.newArrayList();
     for (DeclaringType t : declaringTypes) {
       Imports imports = t.associatedTopLevel().sourceImports();
       if (!sourceClassesImports.contains(imports)) {
         sourceClassesImports.add(imports);
       }
     }
   }
   for (SourceExtraction.Imports imports : sourceClassesImports) {
     @Nullable String resolved = imports.classes.get(resolvable);
     if (resolved != null) {
       return resolved;
     }
   }
   return null;
 }