use of org.ballerinalang.plugins.idea.psi.IdentifierPSINode in project ballerina by ballerina-lang.
the class RecordKeyReference method getVariants.
@NotNull
@Override
public Object[] getVariants() {
List<LookupElement> results = new LinkedList<>();
IdentifierPSINode identifier = getElement();
PsiElement parent = identifier.getParent();
PackageNameNode packageNameNode = PsiTreeUtil.getChildOfType(parent, PackageNameNode.class);
if (packageNameNode == null) {
results.addAll(getVariantsFromCurrentPackage());
}
return results.toArray(new LookupElement[results.size()]);
}
use of org.ballerinalang.plugins.idea.psi.IdentifierPSINode in project ballerina by ballerina-lang.
the class RecordKeyReference method resolve.
private PsiElement resolve(@NotNull AssignmentStatementNode assignmentStatementNode) {
IdentifierPSINode identifier = getElement();
VariableReferenceListNode variableReferenceListNode = PsiTreeUtil.getChildOfType(assignmentStatementNode, VariableReferenceListNode.class);
if (variableReferenceListNode == null) {
return null;
}
PsiElement variableReferenceNode = variableReferenceListNode.getFirstChild();
if (variableReferenceNode == null) {
return null;
}
PsiReference reference = variableReferenceNode.findReferenceAt(0);
if (reference == null) {
return null;
}
PsiElement resolvedElement = reference.resolve();
if (resolvedElement == null) {
return null;
}
PsiElement parent = resolvedElement.getParent();
if (parent instanceof VariableDefinitionNode || parent instanceof ParameterNode) {
return resolve(parent);
} else if (parent instanceof NameReferenceNode) {
StructDefinitionNode structDefinitionNode = resolveStructDefinition(identifier);
if (structDefinitionNode == null) {
return null;
}
Collection<FieldDefinitionNode> fieldDefinitionNodes = PsiTreeUtil.findChildrenOfType(structDefinitionNode, FieldDefinitionNode.class);
for (FieldDefinitionNode fieldDefinitionNode : fieldDefinitionNodes) {
IdentifierPSINode fieldName = PsiTreeUtil.getChildOfType(fieldDefinitionNode, IdentifierPSINode.class);
if (fieldName != null && identifier.getText().equals(fieldName.getText())) {
return fieldName;
}
}
}
return null;
}
use of org.ballerinalang.plugins.idea.psi.IdentifierPSINode in project ballerina by ballerina-lang.
the class RecordKeyReference method resolve.
@Nullable
private PsiElement resolve(@NotNull PsiElement definitionNode) {
IdentifierPSINode identifier = getElement();
TypeNameNode typeNameNode = PsiTreeUtil.getChildOfType(definitionNode, TypeNameNode.class);
if (typeNameNode == null) {
return null;
} else {
// Todo - Add getType util method
PsiReference reference = typeNameNode.findReferenceAt(typeNameNode.getTextLength());
if (reference == null) {
TypeNameNode actualType = PsiTreeUtil.getChildOfType(typeNameNode, TypeNameNode.class);
if (actualType == null) {
return null;
}
reference = actualType.findReferenceAt(actualType.getTextLength());
if (reference == null) {
return null;
}
}
PsiElement resolvedElement = reference.resolve();
if (resolvedElement == null) {
return null;
}
PsiElement resolvedElementParent = resolvedElement.getParent();
if (resolvedElementParent instanceof StructDefinitionNode) {
// Todo - use an util method
Collection<FieldDefinitionNode> fieldDefinitionNodes = PsiTreeUtil.findChildrenOfType(resolvedElementParent, FieldDefinitionNode.class);
for (FieldDefinitionNode fieldDefinitionNode : fieldDefinitionNodes) {
IdentifierPSINode fieldName = PsiTreeUtil.getChildOfType(fieldDefinitionNode, IdentifierPSINode.class);
if (fieldName != null && identifier.getText().equals(fieldName.getText())) {
return fieldName;
}
}
}
}
return null;
}
use of org.ballerinalang.plugins.idea.psi.IdentifierPSINode in project ballerina by ballerina-lang.
the class RecordValueReference method getVariants.
@NotNull
@Override
public Object[] getVariants() {
List<LookupElement> results = new LinkedList<>();
IdentifierPSINode identifier = getElement();
PsiElement prevSibling = identifier.getPrevSibling();
if (prevSibling != null && prevSibling.getPrevSibling() != null && prevSibling.getPrevSibling() instanceof PackageNameNode) {
PsiReference reference = prevSibling.getPrevSibling().findReferenceAt(0);
if (reference != null) {
PsiElement resolvedElement = reference.resolve();
if (resolvedElement instanceof PsiDirectory) {
PsiDirectory currentPackage = (PsiDirectory) resolvedElement;
List<IdentifierPSINode> functions = BallerinaPsiImplUtil.getAllFunctionsFromPackage(currentPackage, true, true);
results.addAll(BallerinaCompletionUtils.createFunctionLookupElements(functions));
List<IdentifierPSINode> enums = BallerinaPsiImplUtil.getAllEnumsFromPackage(currentPackage, true, true);
results.addAll(BallerinaCompletionUtils.createEnumLookupElements(enums, null));
List<IdentifierPSINode> globalVariables = BallerinaPsiImplUtil.getAllGlobalVariablesFromPackage(currentPackage, true, true);
results.addAll(BallerinaCompletionUtils.createGlobalVariableLookupElements(globalVariables));
List<IdentifierPSINode> constants = BallerinaPsiImplUtil.getAllConstantsFromPackage(currentPackage, true, true);
results.addAll(BallerinaCompletionUtils.createConstantLookupElements(constants));
if (!results.isEmpty()) {
return results.toArray(new LookupElement[results.size()]);
}
}
}
}
PsiFile containingFile = identifier.getContainingFile();
PsiFile originalFile = containingFile.getOriginalFile();
List<LookupElement> packages = BallerinaPsiImplUtil.getPackagesAsLookups(originalFile, true, PackageCompletionInsertHandler.INSTANCE_WITH_AUTO_POPUP, true, AutoImportInsertHandler.INSTANCE_WITH_AUTO_POPUP);
results.addAll(packages);
// Todo - improve suggesting elements from a package in StructValueNode since it will not be identified properly
RecordKeyValueNode recordKeyValueNode = PsiTreeUtil.getParentOfType(identifier, RecordKeyValueNode.class);
if (recordKeyValueNode != null) {
RecordKeyNode mapStructKeyNode = PsiTreeUtil.getChildOfType(recordKeyValueNode, RecordKeyNode.class);
if (mapStructKeyNode != null) {
// Todo - use util?
List<PsiElement> importedPackages = BallerinaPsiImplUtil.getImportedPackages(containingFile);
for (PsiElement importedPackage : importedPackages) {
PsiReference reference = importedPackage.findReferenceAt(0);
if (reference == null) {
continue;
}
PsiElement resolvedElement = reference.resolve();
if (resolvedElement == null) {
continue;
}
PsiDirectory resolvedPackage = (PsiDirectory) resolvedElement;
if (mapStructKeyNode.getText().equals(resolvedPackage.getName())) {
List<IdentifierPSINode> functions = BallerinaPsiImplUtil.getAllFunctionsFromPackage(resolvedPackage, false, false);
results.addAll(BallerinaCompletionUtils.createFunctionLookupElements(functions));
Collection<EnumFieldNode> enums = PsiTreeUtil.findChildrenOfType(resolvedPackage, EnumFieldNode.class);
results.addAll(BallerinaCompletionUtils.createEnumFieldLookupElements(enums, (IdentifierPSINode) resolvedElement));
List<IdentifierPSINode> globalVariables = BallerinaPsiImplUtil.getAllGlobalVariablesFromPackage(resolvedPackage, false, false);
results.addAll(BallerinaCompletionUtils.createGlobalVariableLookupElements(globalVariables));
List<IdentifierPSINode> constants = BallerinaPsiImplUtil.getAllConstantsFromPackage(resolvedPackage, false, false);
results.addAll(BallerinaCompletionUtils.createConstantLookupElements(constants));
}
}
}
}
PsiDirectory currentPackage = originalFile.getParent();
if (currentPackage != null) {
List<IdentifierPSINode> functions = BallerinaPsiImplUtil.getAllFunctionsFromPackage(currentPackage, true, true);
results.addAll(BallerinaCompletionUtils.createFunctionLookupElements(functions));
List<IdentifierPSINode> enums = BallerinaPsiImplUtil.getAllEnumsFromPackage(currentPackage, true, true);
results.addAll(BallerinaCompletionUtils.createEnumLookupElements(enums, null));
List<IdentifierPSINode> globalVariables = BallerinaPsiImplUtil.getAllGlobalVariablesFromPackage(currentPackage, true, true);
results.addAll(BallerinaCompletionUtils.createGlobalVariableLookupElements(globalVariables));
List<IdentifierPSINode> constants = BallerinaPsiImplUtil.getAllConstantsFromPackage(currentPackage, true, true);
results.addAll(BallerinaCompletionUtils.createConstantLookupElements(constants));
}
// Todo - use a util method
ScopeNode scope = PsiTreeUtil.getParentOfType(identifier, CodeBlockScope.class, VariableContainer.class, TopLevelDefinition.class, LowerLevelDefinition.class);
if (scope != null) {
int caretOffset = identifier.getStartOffset();
List<IdentifierPSINode> variables = BallerinaPsiImplUtil.getAllLocalVariablesInResolvableScope(scope, caretOffset);
results.addAll(BallerinaCompletionUtils.createVariableLookupElements(variables));
List<IdentifierPSINode> parameters = BallerinaPsiImplUtil.getAllParametersInResolvableScope(scope, caretOffset);
results.addAll(BallerinaCompletionUtils.createParameterLookupElements(parameters));
List<IdentifierPSINode> globalVariables = BallerinaPsiImplUtil.getAllGlobalVariablesInResolvableScope(scope);
results.addAll(BallerinaCompletionUtils.createGlobalVariableLookupElements(globalVariables));
List<IdentifierPSINode> constants = BallerinaPsiImplUtil.getAllConstantsInResolvableScope(scope);
results.addAll(BallerinaCompletionUtils.createConstantLookupElements(constants));
}
return results.toArray(new LookupElement[results.size()]);
}
use of org.ballerinalang.plugins.idea.psi.IdentifierPSINode in project ballerina by ballerina-lang.
the class RecordValueReference method resolve.
@Nullable
@Override
public PsiElement resolve() {
IdentifierPSINode identifier = getElement();
PsiElement prevSibling = identifier.getPrevSibling();
if (prevSibling != null && prevSibling.getPrevSibling() != null && prevSibling.getPrevSibling() instanceof PackageNameNode) {
PsiReference reference = prevSibling.getPrevSibling().findReferenceAt(0);
if (reference != null) {
PsiElement resolvedElement = reference.resolve();
if (resolvedElement instanceof PsiDirectory) {
PsiDirectory psiDirectory = (PsiDirectory) resolvedElement;
// First we try to resolve the reference to following definitions.
PsiElement element = BallerinaPsiImplUtil.resolveElementInPackage(psiDirectory, identifier, true, true, true, true, true, true, true, true);
if (element != null) {
return element;
}
}
}
} else {
PsiFile containingFile = identifier.getContainingFile();
if (containingFile == null) {
return null;
}
PsiFile originalFile = containingFile.getOriginalFile();
PsiDirectory psiDirectory = originalFile.getParent();
if (psiDirectory == null) {
return null;
}
// First we try to resolve the reference to following definitions.
PsiElement element = BallerinaPsiImplUtil.resolveElementInPackage(psiDirectory, identifier, true, true, true, true, true, true, true, true);
if (element != null) {
return element;
}
}
// If the reference is not resolved to an above definition, we try to resolve it to below definition.
return BallerinaPsiImplUtil.resolveElementInScope(identifier, true, true, true, true, true);
}
Aggregations