use of com.goide.psi.impl.imports.GoImportReference in project go-lang-idea-plugin by go-lang-plugin-org.
the class GoInvalidPackageImportInspection method checkFile.
@Override
protected void checkFile(@NotNull GoFile file, @NotNull ProblemsHolder problemsHolder) {
Module module = ModuleUtilCore.findModuleForPsiElement(file);
VirtualFile sdkHome = GoSdkUtil.getSdkSrcDir(file.getProject(), module);
boolean supportsVendoring = GoVendoringUtil.isVendoringEnabled(module);
String sdkVersion = GoSdkService.getInstance(file.getProject()).getSdkVersion(module);
boolean supportsInternalPackages = GoVendoringUtil.supportsInternalPackages(sdkVersion);
boolean supportsInternalPackagesInSdk = sdkHome != null && GoVendoringUtil.supportsSdkInternalPackages(sdkVersion);
for (GoImportSpec importSpec : file.getImports()) {
if (importSpec.isCImport()) {
PsiElement dot = importSpec.getDot();
if (dot != null) {
problemsHolder.registerProblem(importSpec, "Cannot rename import `C`", new GoDeleteImportSpecAlias(), new GoDeleteImportQuickFix());
}
PsiElement identifier = importSpec.getIdentifier();
if (identifier != null) {
problemsHolder.registerProblem(importSpec, "Cannot import 'builtin' package", new GoDeleteImportSpecAlias(), new GoDeleteImportQuickFix());
}
continue;
}
PsiDirectory resolve = importSpec.getImportString().resolve();
if (resolve != null) {
if (GoPackageUtil.isBuiltinPackage(resolve)) {
problemsHolder.registerProblem(importSpec, "Cannot import 'builtin' package", new GoDeleteImportQuickFix());
}
Collection<String> packagesInDirectory = GoPackageUtil.getAllPackagesInDirectory(resolve, module, true);
if (packagesInDirectory.isEmpty()) {
problemsHolder.registerProblem(importSpec, "'" + resolve.getVirtualFile().getPath() + "' has no buildable Go source files", new GoDeleteImportQuickFix());
continue;
}
if (!GoTestFinder.isTestFile(file) && packagesInDirectory.size() == 1 && packagesInDirectory.contains(GoConstants.MAIN)) {
problemsHolder.registerProblem(importSpec, "'" + importSpec.getPath() + "' is a program, not an importable package", new GoDeleteImportQuickFix());
continue;
}
if (packagesInDirectory.size() > 1) {
problemsHolder.registerProblem(importSpec, "Found several packages [" + StringUtil.join(packagesInDirectory, ", ") + "] in '" + resolve.getVirtualFile().getPath() + "'", new GoDeleteImportQuickFix());
continue;
}
VirtualFile contextFile = file.getVirtualFile();
VirtualFile resolvedFile = resolve.getVirtualFile();
boolean resolvedToSdk = sdkHome != null && VfsUtilCore.isAncestor(sdkHome, resolvedFile, false);
boolean validateInternal = supportsInternalPackages || supportsInternalPackagesInSdk && resolvedToSdk;
if (supportsVendoring || validateInternal || resolvedToSdk) {
Set<VirtualFile> sourceRoots = GoSdkUtil.getSourcesPathsToLookup(file.getProject(), module);
for (PsiReference reference : importSpec.getImportString().getReferences()) {
if (reference instanceof GoImportReference) {
String canonicalText = reference.getCanonicalText();
if (resolvedToSdk && GoConstants.TESTDATA_NAME.equals(canonicalText)) {
problemsHolder.registerProblem(importSpec, "Use of testdata package from SDK is not allowed", new GoDeleteImportQuickFix());
break;
} else if (validateInternal && GoConstants.INTERNAL.equals(canonicalText)) {
if (GoSdkUtil.isUnreachableInternalPackage(resolvedFile, contextFile, sourceRoots)) {
problemsHolder.registerProblem(importSpec, "Use of internal package is not allowed", new GoDeleteImportQuickFix());
break;
}
} else if (supportsVendoring && GoConstants.VENDOR.equals(canonicalText)) {
if (GoSdkUtil.isUnreachableVendoredPackage(resolvedFile, contextFile, sourceRoots)) {
problemsHolder.registerProblem(importSpec, "Use of vendored package is not allowed", new GoDeleteImportQuickFix(), GoDisableVendoringInModuleQuickFix.create(module));
break;
} else {
String vendoredImportPath = GoSdkUtil.getImportPath(resolve, true);
if (vendoredImportPath != null) {
problemsHolder.registerProblem(importSpec, "Must be imported as '" + vendoredImportPath + "'", new GoReplaceImportPath(vendoredImportPath), new GoDeleteImportQuickFix(), GoDisableVendoringInModuleQuickFix.create(module));
break;
}
}
}
}
}
}
} else {
for (PsiReference reference : importSpec.getImportString().getReferences()) {
if (reference instanceof GoImportReference) {
if (((GoImportReference) reference).getFileReferenceSet().isAbsolutePathReference()) {
problemsHolder.registerProblem(importSpec, "Cannot import absolute path", new GoDeleteImportQuickFix());
break;
}
}
}
}
}
}
Aggregations