use of org.apache.flex.compiler.definitions.IParameterDefinition in project vscode-nextgenas by BowlerHatLLC.
the class ActionScriptTextDocumentService method signatureHelp.
/**
* Displays a function's parameters, including which one is currently
* active. Called automatically by VSCode any time that the user types "(",
* so be sure to check that a function call is actually happening at the
* current position.
*/
@Override
public CompletableFuture<SignatureHelp> signatureHelp(TextDocumentPositionParams position) {
String textDocumentUri = position.getTextDocument().getUri();
if (!textDocumentUri.endsWith(AS_EXTENSION) && !textDocumentUri.endsWith(MXML_EXTENSION)) {
//we couldn't find a node at the specified location
return CompletableFuture.completedFuture(new SignatureHelp(Collections.emptyList(), -1, -1));
}
IASNode offsetNode = null;
IMXMLTagData offsetTag = getOffsetMXMLTag(position);
if (offsetTag != null) {
IMXMLTagAttributeData attributeData = getMXMLTagAttributeWithValueAtOffset(offsetTag, currentOffset);
if (attributeData != null) {
//some attributes can have ActionScript completion, such as
//events and properties with data binding
IClassDefinition tagDefinition = (IClassDefinition) currentProject.resolveXMLNameToDefinition(offsetTag.getXMLName(), offsetTag.getMXMLDialect());
IDefinition attributeDefinition = currentProject.resolveSpecifier(tagDefinition, attributeData.getShortName());
if (attributeDefinition instanceof IEventDefinition) {
IMXMLInstanceNode mxmlNode = (IMXMLInstanceNode) getOffsetNode(position);
IMXMLEventSpecifierNode eventNode = mxmlNode.getEventSpecifierNode(attributeData.getShortName());
for (IASNode asNode : eventNode.getASNodes()) {
IASNode containingNode = getContainingNodeIncludingStart(asNode, currentOffset);
if (containingNode != null) {
offsetNode = containingNode;
}
}
if (offsetNode == null) {
offsetNode = eventNode;
}
}
}
}
if (offsetNode == null) {
offsetNode = getOffsetNode(position);
}
if (offsetNode == null) {
//we couldn't find a node at the specified location
return CompletableFuture.completedFuture(new SignatureHelp(Collections.emptyList(), -1, -1));
}
IFunctionCallNode functionCallNode = getAncestorFunctionCallNode(offsetNode);
IFunctionDefinition functionDefinition = null;
if (functionCallNode != null) {
IExpressionNode nameNode = functionCallNode.getNameNode();
IDefinition definition = nameNode.resolve(currentUnit.getProject());
if (definition instanceof IFunctionDefinition) {
functionDefinition = (IFunctionDefinition) definition;
} else if (definition instanceof IClassDefinition) {
IClassDefinition classDefinition = (IClassDefinition) definition;
functionDefinition = classDefinition.getConstructor();
} else if (nameNode instanceof IIdentifierNode) {
//special case for super()
IIdentifierNode identifierNode = (IIdentifierNode) nameNode;
if (identifierNode.getName().equals(IASKeywordConstants.SUPER)) {
ITypeDefinition typeDefinition = nameNode.resolveType(currentProject);
if (typeDefinition instanceof IClassDefinition) {
IClassDefinition classDefinition = (IClassDefinition) typeDefinition;
functionDefinition = classDefinitionToConstructor(classDefinition);
}
}
}
}
if (functionDefinition != null) {
SignatureHelp result = new SignatureHelp();
List<SignatureInformation> signatures = new ArrayList<>();
SignatureInformation signatureInfo = new SignatureInformation();
signatureInfo.setLabel(getSignatureLabel(functionDefinition));
List<ParameterInformation> parameters = new ArrayList<>();
for (IParameterDefinition param : functionDefinition.getParameters()) {
ParameterInformation paramInfo = new ParameterInformation();
paramInfo.setLabel(param.getBaseName());
parameters.add(paramInfo);
}
signatureInfo.setParameters(parameters);
signatures.add(signatureInfo);
result.setSignatures(signatures);
result.setActiveSignature(0);
int index = getFunctionCallNodeArgumentIndex(functionCallNode, offsetNode);
IParameterDefinition[] params = functionDefinition.getParameters();
int paramCount = params.length;
if (paramCount > 0 && index >= paramCount) {
if (index >= paramCount) {
IParameterDefinition lastParam = params[paramCount - 1];
if (lastParam.isRest()) {
//functions with rest parameters may accept any
//number of arguments, so continue to make the rest
//parameter active
index = paramCount - 1;
} else {
//if there's no rest parameter, and we're beyond the
//final parameter, none should be active
index = -1;
}
}
}
if (index != -1) {
result.setActiveParameter(index);
}
return CompletableFuture.completedFuture(result);
}
return CompletableFuture.completedFuture(new SignatureHelp(Collections.emptyList(), -1, -1));
}
use of org.apache.flex.compiler.definitions.IParameterDefinition in project vscode-nextgenas by BowlerHatLLC.
the class ActionScriptTextDocumentService method getSignatureLabel.
private String getSignatureLabel(IFunctionDefinition functionDefinition) {
StringBuilder labelBuilder = new StringBuilder();
labelBuilder.append(functionDefinition.getBaseName());
labelBuilder.append("(");
IParameterDefinition[] parameters = functionDefinition.getParameters();
for (int i = 0, count = parameters.length; i < count; i++) {
if (i > 0) {
labelBuilder.append(", ");
}
IParameterDefinition parameterDefinition = parameters[i];
if (parameterDefinition.isRest()) {
labelBuilder.append(IASLanguageConstants.REST);
}
labelBuilder.append(parameterDefinition.getBaseName());
labelBuilder.append(":");
labelBuilder.append(parameterDefinition.getTypeAsDisplayString());
if (parameterDefinition.hasDefaultValue()) {
labelBuilder.append(" = ");
Object defaultValue = parameterDefinition.resolveDefaultValue(currentProject);
if (defaultValue instanceof String) {
labelBuilder.append("\"");
labelBuilder.append(defaultValue);
labelBuilder.append("\"");
} else if (defaultValue != null) {
if (defaultValue.getClass() == Object.class) {
//for some reason, null is some strange random object
labelBuilder.append(IASLanguageConstants.NULL);
} else {
//numeric values and everything else should be okay
labelBuilder.append(defaultValue);
}
} else {
//I don't know how this might happen, but this is probably
//a safe fallback value
labelBuilder.append(IASLanguageConstants.NULL);
}
}
}
labelBuilder.append(")");
if (!functionDefinition.isConstructor()) {
labelBuilder.append(":");
labelBuilder.append(functionDefinition.getReturnTypeAsDisplayString());
}
return labelBuilder.toString();
}
use of org.apache.flex.compiler.definitions.IParameterDefinition in project vscode-nextgenas by BowlerHatLLC.
the class ActionScriptTextDocumentService method getDefinitionDetail.
private String getDefinitionDetail(IDefinition definition) {
StringBuilder detailBuilder = new StringBuilder();
if (definition instanceof IClassDefinition) {
IClassDefinition classDefinition = (IClassDefinition) definition;
if (classDefinition.isDynamic()) {
detailBuilder.append(IASKeywordConstants.DYNAMIC);
detailBuilder.append(" ");
}
detailBuilder.append(IASKeywordConstants.CLASS);
detailBuilder.append(" ");
if (classDefinition.getPackageName().startsWith(PACKAGE_NAME_NO_IMPORT)) {
//classes like __AS3__.vec.Vector should not include the
//package name
detailBuilder.append(classDefinition.getBaseName());
} else {
detailBuilder.append(classDefinition.getQualifiedName());
}
IClassDefinition baseClassDefinition = classDefinition.resolveBaseClass(currentProject);
if (baseClassDefinition != null && !baseClassDefinition.getQualifiedName().equals(IASLanguageConstants.Object)) {
detailBuilder.append(" ");
detailBuilder.append(IASKeywordConstants.EXTENDS);
detailBuilder.append(" ");
detailBuilder.append(baseClassDefinition.getBaseName());
}
IInterfaceDefinition[] interfaceDefinitions = classDefinition.resolveImplementedInterfaces(currentProject);
if (interfaceDefinitions.length > 0) {
detailBuilder.append(" ");
detailBuilder.append(IASKeywordConstants.IMPLEMENTS);
detailBuilder.append(" ");
appendInterfaceNamesToDetail(detailBuilder, interfaceDefinitions);
}
} else if (definition instanceof IInterfaceDefinition) {
IInterfaceDefinition interfaceDefinition = (IInterfaceDefinition) definition;
detailBuilder.append(IASKeywordConstants.INTERFACE);
detailBuilder.append(" ");
detailBuilder.append(interfaceDefinition.getQualifiedName());
IInterfaceDefinition[] interfaceDefinitions = interfaceDefinition.resolveExtendedInterfaces(currentProject);
if (interfaceDefinitions.length > 0) {
detailBuilder.append(" ");
detailBuilder.append(IASKeywordConstants.EXTENDS);
detailBuilder.append(" ");
appendInterfaceNamesToDetail(detailBuilder, interfaceDefinitions);
}
} else if (definition instanceof IVariableDefinition) {
IVariableDefinition variableDefinition = (IVariableDefinition) definition;
IDefinition parentDefinition = variableDefinition.getParent();
if (parentDefinition instanceof ITypeDefinition) {
//IVariableDefinition and IFunctionDefinition
if (variableDefinition instanceof IAccessorDefinition) {
detailBuilder.append("(property) ");
} else if (variableDefinition instanceof IConstantDefinition) {
detailBuilder.append("(const) ");
} else {
detailBuilder.append("(variable) ");
}
detailBuilder.append(parentDefinition.getQualifiedName());
detailBuilder.append(".");
} else if (parentDefinition instanceof IFunctionDefinition) {
if (variableDefinition instanceof IParameterDefinition) {
detailBuilder.append("(parameter) ");
} else {
detailBuilder.append("(local ");
if (variableDefinition instanceof IConstantDefinition) {
detailBuilder.append("const) ");
} else {
detailBuilder.append("var) ");
}
}
} else {
if (variableDefinition instanceof IConstantDefinition) {
detailBuilder.append(IASKeywordConstants.CONST);
} else {
detailBuilder.append(IASKeywordConstants.VAR);
}
detailBuilder.append(" ");
}
detailBuilder.append(variableDefinition.getBaseName());
detailBuilder.append(":");
detailBuilder.append(variableDefinition.getTypeAsDisplayString());
} else if (definition instanceof IFunctionDefinition) {
IFunctionDefinition functionDefinition = (IFunctionDefinition) definition;
IDefinition parentDefinition = functionDefinition.getParent();
if (parentDefinition instanceof ITypeDefinition) {
if (functionDefinition.isConstructor()) {
detailBuilder.append("(constructor) ");
} else {
detailBuilder.append("(method) ");
}
detailBuilder.append(parentDefinition.getQualifiedName());
detailBuilder.append(".");
} else if (parentDefinition instanceof IFunctionDefinition) {
detailBuilder.append("(local function) ");
} else {
detailBuilder.append(IASKeywordConstants.FUNCTION);
detailBuilder.append(" ");
}
detailBuilder.append(getSignatureLabel(functionDefinition));
} else if (definition instanceof IEventDefinition) {
IEventDefinition eventDefinition = (IEventDefinition) definition;
detailBuilder.append("(event) ");
detailBuilder.append("[");
detailBuilder.append(IMetaAttributeConstants.ATTRIBUTE_EVENT);
detailBuilder.append("(");
detailBuilder.append(IMetaAttributeConstants.NAME_EVENT_NAME);
detailBuilder.append("=");
detailBuilder.append("\"");
detailBuilder.append(eventDefinition.getBaseName());
detailBuilder.append("\"");
detailBuilder.append(",");
detailBuilder.append(IMetaAttributeConstants.NAME_EVENT_TYPE);
detailBuilder.append("=");
detailBuilder.append("\"");
detailBuilder.append(eventDefinition.getTypeAsDisplayString());
detailBuilder.append("\"");
detailBuilder.append(")");
detailBuilder.append("]");
} else if (definition instanceof IStyleDefinition) {
IStyleDefinition styleDefinition = (IStyleDefinition) definition;
detailBuilder.append("(style) ");
detailBuilder.append("[");
detailBuilder.append(IMetaAttributeConstants.ATTRIBUTE_STYLE);
detailBuilder.append("(");
detailBuilder.append(IMetaAttributeConstants.NAME_STYLE_NAME);
detailBuilder.append("=");
detailBuilder.append("\"");
detailBuilder.append(styleDefinition.getBaseName());
detailBuilder.append("\"");
detailBuilder.append(",");
detailBuilder.append(IMetaAttributeConstants.NAME_STYLE_TYPE);
detailBuilder.append("=");
detailBuilder.append("\"");
detailBuilder.append(styleDefinition.getTypeAsDisplayString());
detailBuilder.append("\"");
detailBuilder.append(")");
detailBuilder.append("]");
}
return detailBuilder.toString();
}
Aggregations