public static boolean isVisibleSubPackage(PsiPackage subPackage, PbFile curFile) {
   String qSubPackageName = subPackage.getQualifiedName();
   if (curFile.getPackageName().startsWith(qSubPackageName)) {
     return true;
   }
   PbFile[] importedFiles = getImportedFiles(curFile, true);
   for (PbFile importedFile : importedFiles) {
     if (importedFile.getPackageName().startsWith(qSubPackageName)) {
       return true;
     }
   }
   return false;
 }
 public static PbFile[] getImportedFilesByPackageName(PbFile file, @NotNull String packageName) {
   PbImportDef[] importDefs = file.getImportDefinitions();
   ArrayList<PbFile> importFiles = new ArrayList<PbFile>(importDefs.length);
   for (PbImportDef importDef : importDefs) {
     PbFile aliasedFile = importDef.getAliasedFile();
     if (aliasedFile != null && packageName.equals(aliasedFile.getPackageName())) {
       importFiles.add(aliasedFile);
     }
   }
   if (importFiles.size() == 0) {
     return EMPTY_FILE_ARRAY;
   }
   return importFiles.toArray(new PbFile[importFiles.size()]);
 }
 public static PbFile[] getImportedFiles(PbFile file, boolean onlyAliased) {
   PbImportDef[] importDefs = file.getImportDefinitions();
   ArrayList<PbFile> importFiles = new ArrayList<PbFile>(importDefs.length);
   for (PbImportDef importDef : importDefs) {
     PbFile aliasedFile = importDef.getAliasedFile();
     if (aliasedFile != null || !onlyAliased) {
       importFiles.add(aliasedFile);
     }
   }
   if (importFiles.size() == 0) {
     return EMPTY_FILE_ARRAY;
   }
   return importFiles.toArray(new PbFile[importFiles.size()]);
 }
 public static boolean isSamePackage(PbFile file, PsiPackage psiPackage) {
   return psiPackage.getQualifiedName().equals(file.getPackageName());
 }