/*******************************************************************************
* Copyright (c) 2013 Rene Schneider, GEBIT Solutions GmbH and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
/*
* generated by Xtext
*/
package de.gebit.integrity.ui.contentassist;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.ClassFile;
import org.eclipse.jdt.internal.core.CompilationUnit;
import org.eclipse.jface.internal.text.html.BrowserInformationControl;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.common.types.JvmOperation;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.types.JvmVoid;
import org.eclipse.xtext.common.types.util.jdt.IJavaElementFinder;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
import org.eclipse.xtext.ui.shared.internal.Activator;
import com.google.inject.Inject;
import com.google.inject.Injector;
import de.gebit.integrity.dsl.ArbitraryParameterOrResultName;
import de.gebit.integrity.dsl.Call;
import de.gebit.integrity.dsl.CallDefinition;
import de.gebit.integrity.dsl.KeyValuePair;
import de.gebit.integrity.dsl.MethodReference;
import de.gebit.integrity.dsl.NamedResult;
import de.gebit.integrity.dsl.NestedObject;
import de.gebit.integrity.dsl.PackageDefinition;
import de.gebit.integrity.dsl.Parameter;
import de.gebit.integrity.dsl.ParameterName;
import de.gebit.integrity.dsl.ParameterTableHeader;
import de.gebit.integrity.dsl.ParameterTableValue;
import de.gebit.integrity.dsl.ResultName;
import de.gebit.integrity.dsl.ResultTableHeader;
import de.gebit.integrity.dsl.Suite;
import de.gebit.integrity.dsl.SuiteDefinition;
import de.gebit.integrity.dsl.SuiteParameter;
import de.gebit.integrity.dsl.TableTest;
import de.gebit.integrity.dsl.TableTestRow;
import de.gebit.integrity.dsl.Test;
import de.gebit.integrity.dsl.TestDefinition;
import de.gebit.integrity.dsl.TypedNestedObject;
import de.gebit.integrity.dsl.ValueOrEnumValueOrOperationCollection;
import de.gebit.integrity.dsl.Variable;
import de.gebit.integrity.fixtures.ArbitraryParameterEnumerator;
import de.gebit.integrity.fixtures.ArbitraryParameterEnumerator.ArbitraryParameterDefinition;
import de.gebit.integrity.fixtures.ArbitraryParameterFixture;
import de.gebit.integrity.fixtures.CustomProposalFixture;
import de.gebit.integrity.fixtures.CustomProposalProvider;
import de.gebit.integrity.fixtures.CustomProposalProvider.CustomProposalDefinition;
import de.gebit.integrity.operations.UnexecutableException;
import de.gebit.integrity.parameter.conversion.UnresolvableVariableHandling;
import de.gebit.integrity.parameter.resolving.ParameterResolver;
import de.gebit.integrity.parameter.resolving.TableTestParameterResolveMethod;
import de.gebit.integrity.services.DSLGrammarAccess;
import de.gebit.integrity.ui.utils.FixtureTypeWrapper;
import de.gebit.integrity.ui.utils.IntegrityDSLUIUtil;
import de.gebit.integrity.ui.utils.IntegrityDSLUIUtil.FieldDescription;
import de.gebit.integrity.ui.utils.IntegrityDSLUIUtil.ResolvedTypeName;
import de.gebit.integrity.ui.utils.JavadocUtil;
import de.gebit.integrity.utils.IntegrityDSLUtil;
import de.gebit.integrity.utils.ParamAnnotationTypeTriplet;
import de.gebit.integrity.utils.ParameterUtil.UnresolvableVariableException;
import de.gebit.integrity.utils.ResultFieldTuple;
/**
* This class is the extension point to implement custom proposal provider, aka "content assist".
*
* see http://www.eclipse.org/Xtext/documentation/latest/xtext.html#contentAssist on how to customize content assistant
*
* @author Rene Schneider - initial API and implementation
*/
@SuppressWarnings("restriction")
public class DSLProposalProvider extends AbstractDSLProposalProvider {
/**
* The element finder.
*/
@Inject
private IJavaElementFinder elementFinder;
/**
* The grammar access.
*/
@Inject
private DSLGrammarAccess grammarAccess;
/**
* The parameter resolver to use.
*/
@Inject
private ParameterResolver parameterResolver;
/**
* The injector to use.
*/
@Inject
private Injector injector;
/**
* This is added to the proposal priorities from fixture proposal providers to ensure they're listed top in the list
* when they return 0 as priority.
*/
private static final int DEFAULT_PROPOSAL_BASE = 10000;
/**
* Creates a proposal (basically resembles the overridden method, but creates an
* {@link IntegrityConfigurableCompletionProposal} instead, which stores the {@link ContentAssistContext}.
*/
@Override
protected ConfigurableCompletionProposal doCreateProposal(String aProposal, StyledString aDisplayString,
Image anImage, int aPriority, ContentAssistContext aContext) {
int tempReplacementOffset = aContext.getReplaceRegion().getOffset();
int tempReplacementLength = aContext.getReplaceRegion().getLength();
ConfigurableCompletionProposal tempResult = new IntegrityConfigurableCompletionProposal(aProposal,
tempReplacementOffset, tempReplacementLength, aProposal.length(), anImage, aDisplayString, null,
aContext);
tempResult.setPriority(aPriority);
tempResult.setMatcher(aContext.getMatcher());
tempResult.setReplaceContextLength(aContext.getReplaceContextLength());
return tempResult;
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeTest_Parameters(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeTest_Parameters(aModel, anAssignment, aContext, anAcceptor);
Test tempTest = (Test) aModel;
completeTestParametersInternal(tempTest, aContext, anAcceptor);
if (tempTest.getDefinition() != null
&& isArbitraryParameterFixture(tempTest.getDefinition().getFixtureMethod())) {
completeArbitraryParameterOrResultNameInternal(aModel, aContext, anAcceptor, null, true, null, null);
}
}
private void completeTestParametersInternal(Test aTest, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
TestDefinition tempTestDef = aTest.getDefinition();
if (tempTestDef != null) {
Set<String> tempAlreadyUsedParameters = new HashSet<String>();
for (Parameter tempParameter : aTest.getParameters()) {
tempAlreadyUsedParameters
.add(IntegrityDSLUtil.getParamNameStringFromParameterName(tempParameter.getName()));
}
completeParametersInternal(tempAlreadyUsedParameters, tempTestDef.getFixtureMethod(), null, true, aContext,
anAcceptor);
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeCall_Parameters(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeCall_Parameters(aModel, anAssignment, aContext, anAcceptor);
Call tempCall = (Call) aModel;
completeCallParametersInternal(tempCall, aContext, anAcceptor);
if (tempCall.getDefinition() != null
&& isArbitraryParameterFixture(tempCall.getDefinition().getFixtureMethod())) {
completeArbitraryParameterOrResultNameInternal(aModel, aContext, anAcceptor, null, true, null, null);
}
}
private void completeCallParametersInternal(Call aCall, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
CallDefinition tempCallDef = aCall.getDefinition();
if (tempCallDef != null) {
Set<String> tempAlreadyUsedParameters = new HashSet<String>();
for (Parameter tempParameter : aCall.getParameters()) {
tempAlreadyUsedParameters
.add(IntegrityDSLUtil.getParamNameStringFromParameterName(tempParameter.getName()));
}
completeParametersInternal(tempAlreadyUsedParameters, tempCallDef.getFixtureMethod(), null, true, aContext,
anAcceptor);
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void complete_NL(EObject aModel, RuleCall aRuleCall, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.complete_NL(aModel, aRuleCall, aContext, anAcceptor);
// boolean tempLeadingPlusSign = aContext.getPrefix() != null && aContext.getPrefix().startsWith("+");
if (aModel instanceof Test) {
Test tempTest = (Test) aModel;
if (aRuleCall == grammarAccess.getTestAccess().getNLParserRuleCall_4_0()) {
// We're inside the parameters group
completeTestParametersInternal(tempTest, aContext, anAcceptor);
if (tempTest.getDefinition() != null
&& isArbitraryParameterFixture(tempTest.getDefinition().getFixtureMethod())) {
completeArbitraryParameterOrResultNameInternal(aModel, aContext, anAcceptor, null, true, null,
null);
}
} else if (aRuleCall == grammarAccess.getTestAccess().getNLParserRuleCall_4_0()) {
// We're inside the named results group
TestDefinition tempDefinition = tempTest.getDefinition();
if (tempDefinition != null) {
MethodReference tempMethodRef = tempDefinition.getFixtureMethod();
if (tempMethodRef != null) {
Set<String> tempAlreadyUsedResults = new HashSet<String>();
for (NamedResult tempNamedResult : tempTest.getResults()) {
tempAlreadyUsedResults.add(IntegrityDSLUtil
.getExpectedResultNameStringFromTestResultName(tempNamedResult.getName()));
}
completeNamedResultsInternal(tempAlreadyUsedResults, tempMethodRef, null, aContext, anAcceptor);
if (isArbitraryParameterFixture(tempMethodRef)) {
completeArbitraryParameterOrResultNameInternal(aModel, aContext, anAcceptor, null, true,
null, null);
}
}
}
}
} else if (aModel instanceof Call) {
Call tempCall = (Call) aModel;
if (aRuleCall == grammarAccess.getCallAccess().getNLParserRuleCall_4_0()) {
// We're inside the parameters group
completeCallParametersInternal(tempCall, aContext, anAcceptor);
if (tempCall.getDefinition() != null
&& isArbitraryParameterFixture(tempCall.getDefinition().getFixtureMethod())) {
completeArbitraryParameterOrResultNameInternal(aModel, aContext, anAcceptor, null, true, null,
null);
}
}
} else if (aModel instanceof TableTest) {
TableTest tempTest = (TableTest) aModel;
if (aRuleCall == grammarAccess.getTableTestAccess().getNLParserRuleCall_3_0()) {
// We're inside the parameters group
completeTableTestParametersInternal(tempTest, aContext, anAcceptor);
}
} else if (aModel instanceof Parameter) {
completeParameterValueInternal((Parameter) aModel, aContext, anAcceptor);
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeTableTest_Parameters(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeTableTest_Parameters(aModel, anAssignment, aContext, anAcceptor);
completeTableTestParametersInternal((TableTest) aModel, aContext, anAcceptor);
}
private void completeTableTestParametersInternal(TableTest aTest, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
TestDefinition tempTestDef = aTest.getDefinition();
if (tempTestDef != null) {
Set<String> tempAlreadyUsedParameters = new HashSet<String>();
for (Parameter tempParameter : aTest.getParameters()) {
tempAlreadyUsedParameters
.add(IntegrityDSLUtil.getParamNameStringFromParameterName(tempParameter.getName()));
}
for (ParameterTableHeader tempHeader : aTest.getParameterHeaders()) {
tempAlreadyUsedParameters
.add(IntegrityDSLUtil.getParamNameStringFromParameterName(tempHeader.getName()));
}
completeParametersInternal(tempAlreadyUsedParameters, tempTestDef.getFixtureMethod(), null, true, aContext,
anAcceptor);
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeTableTest_ParameterHeaders(EObject aModel, Assignment anAssignment,
ContentAssistContext aContext, ICompletionProposalAcceptor anAcceptor) {
super.completeTableTest_ParameterHeaders(aModel, anAssignment, aContext, anAcceptor);
completeParameterAndResultHeaderInternal(aModel, aContext, anAcceptor, true);
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeParameterTableHeader_Name(EObject aModel, Assignment anAssignment,
ContentAssistContext aContext, ICompletionProposalAcceptor anAcceptor) {
super.completeParameterTableHeader_Name(aModel, anAssignment, aContext, anAcceptor);
completeParameterAndResultHeaderInternal(aModel, aContext, anAcceptor, true);
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeResultTableHeader_Name(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeResultTableHeader_Name(aModel, anAssignment, aContext, anAcceptor);
completeParameterAndResultHeaderInternal(aModel, aContext, anAcceptor, false);
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeTableTest_ResultHeaders(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeTableTest_ResultHeaders(aModel, anAssignment, aContext, anAcceptor);
completeParameterAndResultHeaderInternal(aModel, aContext, anAcceptor, false);
}
private void completeParameterAndResultHeaderInternal(Object aModel, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor, boolean anIncludeParametersFlag) {
TableTest tempTableTest = null;
if (aModel instanceof TableTest) {
tempTableTest = (TableTest) aModel;
} else {
tempTableTest = (TableTest) NodeModelUtils.findActualSemanticObjectFor(aContext.getCurrentNode());
}
if (tempTableTest != null) {
TestDefinition tempTestDef = tempTableTest.getDefinition();
if (tempTestDef != null) {
MethodReference tempMethod = tempTestDef.getFixtureMethod();
if (tempMethod != null) {
if (anIncludeParametersFlag) {
Set<String> tempAlreadyUsedParameters = new HashSet<String>();
for (Parameter tempParameter : tempTableTest.getParameters()) {
tempAlreadyUsedParameters
.add(IntegrityDSLUtil.getParamNameStringFromParameterName(tempParameter.getName()));
}
for (ParameterTableHeader tempParameterHeader : tempTableTest.getParameterHeaders()) {
tempAlreadyUsedParameters.add(IntegrityDSLUtil
.getParamNameStringFromParameterName(tempParameterHeader.getName()));
}
completeParametersInternal(tempAlreadyUsedParameters, tempMethod, null, false, aContext,
anAcceptor);
}
Set<String> tempAlreadyUsedResults = new HashSet<String>();
for (ResultTableHeader tempResultHeader : tempTableTest.getResultHeaders()) {
tempAlreadyUsedResults.add(IntegrityDSLUtil
.getExpectedResultNameStringFromTestResultName(tempResultHeader.getName()));
}
completeNamedResultsInternal(tempAlreadyUsedResults, tempMethod, null, aContext, anAcceptor);
if (isArbitraryParameterFixture(tempMethod)) {
if (anIncludeParametersFlag) {
completeArbitraryParameterOrResultNameInternal(tempTableTest, aContext, anAcceptor, null,
false, null, null);
}
completeArbitraryParameterOrResultNameInternal(tempTableTest, aContext, anAcceptor, null, true,
null, null);
}
}
}
}
}
private void completeParametersInternal(Set<String> someAlreadyUsedParameters, MethodReference aMethod,
String aPrefix, boolean anAddColonFlag, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
if (aMethod == null || aMethod.getMethod() == null) {
return;
}
Map<String, String> tempJavadocMap = JavadocUtil.getMethodParamJavadoc(aMethod.getMethod(), elementFinder);
List<ParamAnnotationTypeTriplet> tempParamList = IntegrityDSLUtil.getAllParamNamesFromFixtureMethod(aMethod);
for (ParamAnnotationTypeTriplet tempParam : tempParamList) {
if (!someAlreadyUsedParameters.contains(tempParam.getParamName())) {
String tempJavadocDescription = tempJavadocMap != null
? tempJavadocMap.get(tempParam.getJavaParamName()) : null;
String tempDisplayText = null;
if (tempJavadocDescription != null) {
tempDisplayText = tempParam.getParamName() + ": " + tempJavadocDescription;
} else {
tempDisplayText = tempParam.getParamName();
}
anAcceptor.accept(createCompletionProposal(
(aPrefix != null ? aPrefix : "") + tempParam.getParamName() + (anAddColonFlag ? ":" : ""),
tempDisplayText, null, aContext));
}
}
}
private void completeNamedResultsInternal(Set<String> someAlreadyUsedResults, MethodReference aMethod,
String aPrefix, ContentAssistContext aContext, ICompletionProposalAcceptor anAcceptor) {
if (aMethod == null || aMethod.getMethod() == null) {
return;
}
List<ResultFieldTuple> tempResultFields = IntegrityDSLUtil.getAllResultNamesFromFixtureMethod(aMethod);
for (ResultFieldTuple tempResult : tempResultFields) {
if (!someAlreadyUsedResults.contains(tempResult.getResultName())) {
String tempJavadocDescription = JavadocUtil.getJvmFieldJavadoc(tempResult.getField(), elementFinder);
String tempDisplayText = tempResult.getResultName();
ICompletionProposal tempCompletionProposal = createCompletionProposal(
(aPrefix != null ? aPrefix : "") + tempResult.getResultName() + " = ", tempDisplayText, null,
aContext);
if (tempCompletionProposal instanceof ConfigurableCompletionProposal) {
if (tempJavadocDescription != null) {
((ConfigurableCompletionProposal) tempCompletionProposal)
.setAdditionalProposalInfo(tempJavadocDescription);
}
}
anAcceptor.accept(tempCompletionProposal);
}
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeArbitraryParameterOrResultName_Identifier(EObject aModel, Assignment anAssignment,
ContentAssistContext aContext, ICompletionProposalAcceptor anAcceptor) {
super.completeArbitraryParameterOrResultName_Identifier(aModel, anAssignment, aContext, anAcceptor);
EObject tempContainer = null;
if (aModel instanceof Parameter) {
tempContainer = aModel.eContainer();
} else if (aModel instanceof ArbitraryParameterOrResultName) {
tempContainer = aModel.eContainer().eContainer();
} else if (aModel instanceof NamedResult) {
tempContainer = aModel.eContainer();
} else {
// assume the model is already the outer container we search for
tempContainer = aModel;
}
completeArbitraryParameterOrResultNameInternal(tempContainer, aContext, anAcceptor, null, false, null, null);
}
private void completeArbitraryParameterOrResultNameInternal(EObject aModel, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor, Boolean anIsResultFlag, boolean aPrefixPlusSignFlag,
List<String> aParameterPath, Set<String> someAlreadyUsedNestedParameters) {
// We need these parameter and result maps in order to sort out proposals for parameters/results already given
Map<String, Object> tempParameterMap = null;
Map<String, Object> tempExpectedResultMap = null;
MethodReference tempMethodReference = null;
try {
if (aModel instanceof Test) {
Test tempTest = (Test) aModel;
tempParameterMap = parameterResolver.createParameterMap(tempTest, true,
UnresolvableVariableHandling.KEEP_UNRESOLVED);
tempExpectedResultMap = parameterResolver.createExpectedResultMap(tempTest, true);
tempMethodReference = tempTest.getDefinition().getFixtureMethod();
} else if (aModel instanceof TableTest) {
TableTest tempTest = (TableTest) aModel;
tempParameterMap = parameterResolver.createParameterMap(tempTest, null,
TableTestParameterResolveMethod.COMBINED, true, UnresolvableVariableHandling.KEEP_UNRESOLVED);
tempExpectedResultMap = new LinkedHashMap<String, Object>();
for (ResultTableHeader tempHeader : tempTest.getResultHeaders()) {
tempExpectedResultMap.put(
IntegrityDSLUtil.getExpectedResultNameStringFromTestResultName(tempHeader.getName()), null);
}
tempMethodReference = tempTest.getDefinition().getFixtureMethod();
} else if (aModel instanceof Call) {
Call tempCall = (Call) aModel;
tempParameterMap = parameterResolver.createParameterMap(tempCall.getParameters(), true,
UnresolvableVariableHandling.KEEP_UNRESOLVED);
tempMethodReference = tempCall.getDefinition().getFixtureMethod();
}
} catch (InstantiationException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (ClassNotFoundException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (UnexecutableException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
}
if (tempParameterMap != null && tempMethodReference != null && tempMethodReference.getType() != null) {
try {
IType tempJDTType = resolveJDTTypeForJvmType(tempMethodReference.getType());
FixtureTypeWrapper tempFixtureClassWrapper = wrapType(tempJDTType);
ArbitraryParameterEnumerator tempEnumerator = tempFixtureClassWrapper
.instantiateArbitraryParameterEnumerator();
if (tempEnumerator != null) {
resolveVariables(tempParameterMap);
tempFixtureClassWrapper.convertParameterValuesToFixtureDefinedTypes(
tempMethodReference.getMethod().getSimpleName(), tempParameterMap, aParameterPath, false);
if (aParameterPath == null) {
// This is the "classic" path, if we're directly creating a parameter. We dont need the already
// used nested param set here.
// first fetch the arbitrary parameter names...
List<ArbitraryParameterDefinition> tempParameterDescriptions = tempEnumerator
.defineArbitraryParameters(tempMethodReference.getMethod().getSimpleName(),
tempParameterMap, aParameterPath);
if (tempParameterDescriptions != null) {
for (ArbitraryParameterDefinition tempParameterDescription : tempParameterDescriptions) {
String tempName = tempParameterDescription.getName();
if (!tempParameterMap.containsKey(tempName)) {
String tempDescription = tempName + ": ";
if (tempParameterDescription.getDescription() != null) {
tempDescription += " (" + tempParameterDescription.getDescription() + ")";
}
String tempPrefix = aPrefixPlusSignFlag ? "+" : "";
String tempSuffix = (aModel instanceof TableTest) ? ""
: (tempParameterDescription.getSuffix() != null
? tempParameterDescription.getSuffix().getText() : ": ");
if (!(aModel instanceof TableTest)
&& tempParameterDescription.isNestedObjectParam()) {
tempSuffix += "{}";
}
anAcceptor.accept(createCompletionProposal(tempPrefix + tempName + tempSuffix,
tempPrefix + tempDescription, null, aContext));
}
}
}
// ...then add the arbitrary result names
if (tempExpectedResultMap != null) {
List<ArbitraryParameterDefinition> tempResultDescriptions = tempEnumerator
.defineArbitraryResults(tempMethodReference.getMethod().getSimpleName(),
tempParameterMap, aParameterPath);
if (tempResultDescriptions != null) {
for (ArbitraryParameterDefinition tempResultDescription : tempResultDescriptions) {
String tempName = tempResultDescription.getName();
if (!tempExpectedResultMap.containsKey(tempName)) {
String tempDescription = tempName + " = ?";
if (tempResultDescription.getDescription() != null) {
tempDescription += " (" + tempResultDescription.getDescription() + ")";
}
String tempPrefix = aPrefixPlusSignFlag ? "+" : "";
String tempSuffix = tempResultDescription.getSuffix() != null
? tempResultDescription.getSuffix().getText() : " = ";
if (tempResultDescription.isNestedObjectParam()) {
tempSuffix += "{}";
}
anAcceptor.accept(createCompletionProposal(tempPrefix + tempName + tempSuffix,
tempPrefix + tempDescription, null, aContext));
}
}
}
}
} else {
// This is the path to take if we were given a subparameter path, which means we're actually
// inside a nested parameter object, either used as a result or as a parameter.
List<ArbitraryParameterDefinition> tempParameterDescriptions = null;
if (Boolean.FALSE.equals(anIsResultFlag)) {
tempParameterDescriptions = tempEnumerator.defineArbitraryParameters(
tempMethodReference.getMethod().getSimpleName(), tempParameterMap, aParameterPath);
} else if (Boolean.TRUE.equals(anIsResultFlag)) {
tempParameterDescriptions = tempEnumerator.defineArbitraryResults(
tempMethodReference.getMethod().getSimpleName(), tempParameterMap, aParameterPath);
}
if (tempParameterDescriptions != null) {
for (ArbitraryParameterDefinition tempParameterDescription : tempParameterDescriptions) {
if (tempParameterDescription.hasSubdefinitions()) {
ArbitraryParameterDefinition tempDefinition = tempParameterDescription
.getSubdefinitionByPath(aParameterPath);
if (tempDefinition != null && tempDefinition.hasSubdefinitions()) {
for (ArbitraryParameterDefinition tempSubdefinition : tempDefinition
.getSubdefinitions()) {
String tempDescription = tempSubdefinition.getName();
if (!someAlreadyUsedNestedParameters.contains(tempDescription)) {
if (tempSubdefinition.getDescription() != null) {
tempDescription += ": " + tempSubdefinition.getDescription();
}
String tempSuffix = ": ";
if (tempSubdefinition.isNestedObjectParam()) {
tempSuffix += "{}";
}
anAcceptor.accept(createCompletionProposal(
tempSubdefinition.getName() + tempSuffix, tempDescription, null,
aContext));
}
}
}
}
}
}
}
}
} catch (JavaModelException exc) {
exc.printStackTrace();
} catch (UnexecutableException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (Throwable exc) {
// This should catch anything else, especially errors in the enumerators' code
Activator.getDefault().getLog().log(new Status(Status.ERROR, "de.gebit.integrity.dsl.ui",
"An exception was caught during arbitrary parameter/result enumeration", exc));
}
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeKeyValuePair_Identifier(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeKeyValuePair_Identifier(aModel, anAssignment, aContext, anAcceptor);
completeKeyValuePairInternal(aModel, aContext, anAcceptor);
}
private void completeKeyValuePairInternal(EObject aModel, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
if ((aModel instanceof NestedObject) && (aModel.eContainer() instanceof TypedNestedObject)) {
// Once we've begun entering data into a typed nested objects' inner nested object, Xtext seems to ignore
// the "typed" wrapper and request proposals for the inner nested object directly. This code deals with
// that situation.
completeKeyValuePairInternal(aModel.eContainer(), aContext, anAcceptor);
return;
}
Set<String> tempAlreadyUsedKeys = new HashSet<String>();
if (aModel instanceof NestedObject) {
for (KeyValuePair tempPair : ((NestedObject) aModel).getAttributes()) {
tempAlreadyUsedKeys.add(IntegrityDSLUtil.getIdentifierFromKeyValuePair(tempPair));
}
} else if ((aModel instanceof TypedNestedObject) && ((TypedNestedObject) aModel).getNestedObject() != null) {
for (KeyValuePair tempPair : ((TypedNestedObject) aModel).getNestedObject().getAttributes()) {
tempAlreadyUsedKeys.add(IntegrityDSLUtil.getIdentifierFromKeyValuePair(tempPair));
}
}
List<String> tempParameterPath = new ArrayList<String>();
EObject tempOwner = determineNestedObjectOwner(aModel, tempParameterPath);
Collections.reverse(tempParameterPath);
TypedNestedObject tempRootTypedNestedObject = determineRootTypedNestedObject(aModel, null);
if ((tempOwner instanceof Test) || (tempOwner instanceof Call) || (tempOwner instanceof TableTest)) {
Boolean tempIsResult = IntegrityDSLUtil.isResult(aModel);
IType tempRootType = null;
if (tempRootTypedNestedObject != null
&& ((TypedNestedObject) tempRootTypedNestedObject).getType() != null) {
// In case of typed nested objects, the root type is already known
try {
tempRootType = resolveJDTTypeForJvmType(
((TypedNestedObject) tempRootTypedNestedObject).getType().getType());
} catch (JavaModelException exc) {
throw new RuntimeException(exc);
}
}
// The following code deals with Java Bean classes used for nested param storage
MethodReference tempMethodReference = IntegrityDSLUtil.getMethodReferenceForAction(tempOwner);
if (tempMethodReference != null && tempMethodReference.getMethod() != null) {
if (isArbitraryParameterFixture(tempMethodReference)) {
// The arbitrary stuff requires a lot of boilerplate functionality, thus we use the arbitrary param
// method here as well
completeArbitraryParameterOrResultNameInternal(tempOwner, aContext, anAcceptor, tempIsResult, false,
tempParameterPath, tempAlreadyUsedKeys);
}
if (tempParameterPath.size() > 0) {
if (tempRootType == null) {
// If the root type is not yet known from this being a typed nested object, it must be
// determined by looking at the fixture methods' parameter types
String tempParamName = tempParameterPath.get(0);
if (tempParamName == null) {
// this must be the default result
tempRootType = IntegrityDSLUIUtil
.findTypeByName(tempMethodReference.getMethod().getReturnType().getQualifiedName());
} else {
// First, search for parameters...
List<ParamAnnotationTypeTriplet> tempParamList = IntegrityDSLUtil
.getAllParamNamesFromFixtureMethod(tempMethodReference);
for (ParamAnnotationTypeTriplet tempPossibleParam : tempParamList) {
if (tempParamName.equals(tempPossibleParam.getParamName())) {
if (tempPossibleParam != null && tempPossibleParam.getType() != null
&& tempPossibleParam.getType().getType() != null) {
String tempQualifiedName = tempPossibleParam.getType().getType()
.getQualifiedName();
// The qualified name can contain brackets here if it is an array. We don't care
// for arrays for the purpose of proposal providing, so we strip the array
// brackets.
if (tempQualifiedName.endsWith("[]")) {
tempQualifiedName = tempQualifiedName.substring(0,
tempQualifiedName.length() - 2);
}
tempRootType = IntegrityDSLUIUtil.findTypeByName(tempQualifiedName);
}
break;
}
}
if (tempRootType == null) {
// If nothing was found, look into named test results
List<ResultFieldTuple> tempResultList = IntegrityDSLUtil
.getAllResultNamesFromFixtureMethod(tempMethodReference);
for (ResultFieldTuple tempPossibleResult : tempResultList) {
if (tempParamName.equals(tempPossibleResult.getResultName())) {
if (tempPossibleResult != null && tempPossibleResult.getField() != null) {
String tempQualifiedName = tempPossibleResult.getField().getQualifiedName();
// The qualified name can contain brackets here if it is an array. We don't
// care
// for arrays for the purpose of proposal providing, so we strip the array
// brackets.
if (tempQualifiedName.endsWith("[]")) {
tempQualifiedName = tempQualifiedName.substring(0,
tempQualifiedName.length() - 2);
}
tempRootType = IntegrityDSLUIUtil.findTypeByName(tempQualifiedName);
}
break;
}
}
}
}
}
IType tempTypeInFocus = tempRootType;
try {
if (tempTypeInFocus != null) {
int tempDepth = 1;
while (tempDepth < tempParameterPath.size()) {
String tempPathSegment = tempParameterPath.get(tempDepth);
IField tempField = IntegrityDSLUIUtil.findFieldByName(tempTypeInFocus, tempPathSegment);
if (tempField == null) {
// we should have found another field, but couldn't!
tempTypeInFocus = null;
} else {
ResolvedTypeName tempResolvedTypeName = IntegrityDSLUIUtil
.getResolvedTypeName(tempField.getTypeSignature(), tempTypeInFocus);
if (tempResolvedTypeName.getGenericParameterTypes() == null) {
tempTypeInFocus = IntegrityDSLUIUtil
.findTypeByName(tempResolvedTypeName.getRawType());
} else {
// We support 1 single generic parameter only here, since that's enough to deal
// with the also-supported collections like List<Integer> or Set<Boolean>
tempTypeInFocus = IntegrityDSLUIUtil.findTypeByName(
tempResolvedTypeName.getGenericParameterTypes()[0].getRawType());
}
}
tempDepth++;
}
if (tempTypeInFocus != null) {
// Okay, we have reached our goal - the fields of this type are our proposals
for (FieldDescription tempField : IntegrityDSLUIUtil.getAllFields(tempTypeInFocus,
true)) {
String tempJavadocDescription = tempField.getJavaDoc();
String tempDisplayText = tempField.getFieldName();
if (!tempAlreadyUsedKeys.contains(tempField.getFieldName())) {
ICompletionProposal tempCompletionProposal = createCompletionProposal(
tempField.getFieldName() + ": ", tempDisplayText, null, aContext);
if (tempCompletionProposal instanceof ConfigurableCompletionProposal) {
if (tempJavadocDescription != null) {
((ConfigurableCompletionProposal) tempCompletionProposal)
.setAdditionalProposalInfo(tempJavadocDescription);
}
}
anAcceptor.accept(tempCompletionProposal);
}
}
}
}
} catch (JavaModelException exc) {
// TODO Auto-generated catch block
exc.printStackTrace();
}
}
}
}
}
private EObject determineNestedObjectOwner(EObject aNestedObject, List<String> aParameterPath) {
EObject tempParent = aNestedObject.eContainer();
if (tempParent instanceof KeyValuePair) {
String tempIdentifier = IntegrityDSLUtil.getIdentifierFromKeyValuePair((KeyValuePair) tempParent);
aParameterPath.add(tempIdentifier);
if (tempParent.eContainer() instanceof NestedObject) {
return determineNestedObjectOwner((NestedObject) tempParent.eContainer(), aParameterPath);
}
} else if (tempParent instanceof Parameter) {
aParameterPath
.add(IntegrityDSLUtil.getParamNameStringFromParameterName(((Parameter) tempParent).getName()));
} else if (tempParent instanceof NamedResult) {
aParameterPath.add(IntegrityDSLUtil
.getExpectedResultNameStringFromTestResultName(((NamedResult) tempParent).getName()));
} else if (tempParent instanceof ParameterTableValue) {
// in case of tabletests we need to trace the table cell to its header
EObject tempHeaderCell = IntegrityDSLUtil.getTableHeaderForTableCell((ParameterTableValue) tempParent);
if (tempHeaderCell instanceof ParameterTableHeader) {
aParameterPath.add(IntegrityDSLUtil
.getParamNameStringFromParameterName(((ParameterTableHeader) tempHeaderCell).getName()));
} else if (tempHeaderCell instanceof ResultTableHeader) {
aParameterPath.add(IntegrityDSLUtil
.getExpectedResultNameStringFromTestResultName(((ResultTableHeader) tempHeaderCell).getName()));
} else if (tempHeaderCell instanceof TableTest) {
// default result column case
aParameterPath.add(null);
}
} else if (tempParent instanceof Test) {
if (aNestedObject == ((Test) tempParent).getResult()) {
// default result case
aParameterPath.add(null);
}
return tempParent;
} else if (tempParent instanceof Call) {
return tempParent;
} else if (tempParent instanceof TableTest) {
return tempParent;
} else {
if ((tempParent instanceof SuiteDefinition) || (tempParent instanceof PackageDefinition)) {
return null;
}
}
return determineNestedObjectOwner(tempParent, aParameterPath);
}
private TypedNestedObject determineRootTypedNestedObject(EObject aNestedObject, TypedNestedObject aLastFound) {
EObject tempParent = aNestedObject.eContainer();
if (tempParent == null) {
return aLastFound;
} else {
if (aNestedObject instanceof TypedNestedObject) {
return determineRootTypedNestedObject(tempParent, (TypedNestedObject) aNestedObject);
} else {
return determineRootTypedNestedObject(tempParent, aLastFound);
}
}
}
/**
* Resolves all variable values in the given map.
*
* @param aParameterMap
*/
private void resolveVariables(Map<String, Object> aParameterMap) {
for (Entry<String, Object> tempEntry : aParameterMap.entrySet()) {
if (tempEntry.getValue() instanceof Variable) {
tempEntry.setValue(parameterResolver.resolveStatically((Variable) tempEntry.getValue(), null));
}
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeTest_Result(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeTest_Result(aModel, anAssignment, aContext, anAcceptor);
if (aModel instanceof Test) {
Test tempTest = (Test) aModel;
MethodReference tempMethod = tempTest.getDefinition().getFixtureMethod();
List<Parameter> tempAllParameters = tempTest.getParameters();
if (tempMethod != null) {
if (isCustomProposalFixture(tempMethod)) {
try {
IType tempJDTType = resolveJDTTypeForJvmType(tempMethod.getType());
FixtureTypeWrapper tempFixtureClassWrapper = wrapType(tempJDTType);
Map<String, Object> tempParamMap = parameterResolver.createParameterMap(tempAllParameters, true,
UnresolvableVariableHandling.KEEP_UNRESOLVED);
Object tempResultValue = tempFixtureClassWrapper.convertResultValueToFixtureDefinedType(
tempMethod.getMethod().getSimpleName(), null, tempTest.getResult());
completeCustomProposalResultValuesInternal(null, tempMethod, tempResultValue, tempParamMap,
null, aContext, anAcceptor);
} catch (JavaModelException exc) {
exc.printStackTrace();
} catch (ClassNotFoundException exc) {
exc.printStackTrace();
} catch (UnexecutableException exc) {
exc.printStackTrace();
} catch (InstantiationException exc) {
exc.printStackTrace();
}
}
if (isArbitraryParameterFixture(tempMethod)) {
completeArbitraryParameterOrResultNameInternal(aModel, aContext, anAcceptor, null, false, null,
null);
}
}
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeNamedResult_Value(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeNamedResult_Value(aModel, anAssignment, aContext, anAcceptor);
if (aModel instanceof NamedResult) {
NamedResult tempResult = (NamedResult) aModel;
Test tempTest = (Test) tempResult.eContainer();
MethodReference tempMethod = tempTest.getDefinition().getFixtureMethod();
List<Parameter> tempAllParameters = tempTest.getParameters();
if (tempMethod != null && isCustomProposalFixture(tempMethod)) {
try {
IType tempJDTType = resolveJDTTypeForJvmType(tempMethod.getType());
FixtureTypeWrapper tempFixtureClassWrapper = wrapType(tempJDTType);
Map<String, Object> tempParamMap = parameterResolver.createParameterMap(tempAllParameters, true,
UnresolvableVariableHandling.KEEP_UNRESOLVED);
Object tempResultValue = tempFixtureClassWrapper.convertResultValueToFixtureDefinedType(
tempMethod.getMethod().getSimpleName(), tempResult.getName(), tempResult.getValue());
completeCustomProposalResultValuesInternal(tempResult.getName(), tempMethod, tempResultValue,
tempParamMap, null, aContext, anAcceptor);
} catch (JavaModelException exc) {
exc.printStackTrace();
} catch (ClassNotFoundException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (UnexecutableException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (InstantiationException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
}
}
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeParameter_Value(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeParameter_Value(aModel, anAssignment, aContext, anAcceptor);
if (aModel instanceof Parameter) {
completeParameterValueInternal((Parameter) aModel, aContext, anAcceptor);
}
}
private void completeParameterValueInternal(Parameter aParameter, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
Parameter tempParam = (Parameter) aParameter;
MethodReference tempMethod = null;
List<Parameter> tempAllParameters = null;
if (tempParam.eContainer() instanceof Test) {
Test tempTest = (Test) tempParam.eContainer();
tempMethod = tempTest.getDefinition().getFixtureMethod();
tempAllParameters = tempTest.getParameters();
} else if (tempParam.eContainer() instanceof Call) {
Call tempCall = (Call) tempParam.eContainer();
tempMethod = tempCall.getDefinition().getFixtureMethod();
tempAllParameters = tempCall.getParameters();
} else if (tempParam.eContainer() instanceof TableTest) {
TableTest tempTableTest = (TableTest) tempParam.eContainer();
tempMethod = tempTableTest.getDefinition().getFixtureMethod();
tempAllParameters = tempTableTest.getParameters();
}
if (tempMethod != null && isCustomProposalFixture(tempMethod)) {
try {
Map<String, Object> tempParamMap = parameterResolver.createParameterMap(tempAllParameters, true,
UnresolvableVariableHandling.KEEP_UNRESOLVED);
completeParameterValuesInternal(tempParam.getName(), tempMethod, tempParamMap, null, aContext,
anAcceptor);
} catch (InstantiationException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (ClassNotFoundException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (UnexecutableException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
}
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeTableTestRow_Values(EObject aModel, Assignment anAssignment, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
super.completeTableTestRow_Values(aModel, anAssignment, aContext, anAcceptor);
if (aModel instanceof TableTestRow) {
TableTestRow tempRow = (TableTestRow) aModel;
TableTest tempTest = (TableTest) tempRow.eContainer();
MethodReference tempMethod = tempTest.getDefinition().getFixtureMethod();
if (tempMethod != null && isCustomProposalFixture(tempMethod)) {
EObject tempSemanticObject = NodeModelUtils.findActualSemanticObjectFor(aContext.getCurrentNode());
int tempColumn = -1;
if (tempSemanticObject instanceof ParameterTableValue) {
// we're inside an empty parameter table value
tempColumn = tempRow.getValues().indexOf(tempSemanticObject);
} else if (tempSemanticObject == tempRow) {
if ("".equals(aContext.getPrefix())) {
// we're at the last (still opened and not really started) parameter table value
tempColumn = tempRow.getValues().size();
} else {
// we're at the last parameter table value
tempColumn = tempRow.getValues().size() - 1;
}
}
if (tempColumn >= 0) {
if (tempColumn < tempTest.getParameterHeaders().size()) {
try {
Map<String, Object> tempParamMap = parameterResolver.createParameterMap(tempTest, tempRow,
TableTestParameterResolveMethod.COMBINED, true,
UnresolvableVariableHandling.KEEP_UNRESOLVED);
completeParameterValuesInternal(tempTest.getParameterHeaders().get(tempColumn).getName(),
tempMethod, tempParamMap, null, aContext, anAcceptor);
} catch (InstantiationException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (ClassNotFoundException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (UnexecutableException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
}
} else {
// we might be in the range of the result columns
int tempResultColumn = tempColumn - tempTest.getParameterHeaders().size();
boolean tempDefaultResultExists = tempTest.getDefaultResultColumn() != null;
if (tempResultColumn >= 0 && tempResultColumn < tempTest.getResultHeaders().size()
+ (tempDefaultResultExists ? 1 : 0)) {
try {
ResultName tempResultName = null;
if (tempResultColumn < tempTest.getResultHeaders().size()) {
tempResultName = tempTest.getResultHeaders().get(tempResultColumn).getName();
}
ValueOrEnumValueOrOperationCollection tempResultValue = null;
if (tempColumn < tempRow.getValues().size()) {
tempResultValue = tempRow.getValues().get(tempColumn).getValue();
}
Object tempConvertedResultValue = null;
if (tempResultValue != null) {
IType tempJDTType = resolveJDTTypeForJvmType(tempMethod.getType());
FixtureTypeWrapper tempFixtureClassWrapper = wrapType(tempJDTType);
tempConvertedResultValue = tempFixtureClassWrapper
.convertResultValueToFixtureDefinedType(
tempMethod.getMethod().getSimpleName(), tempResultName,
tempResultValue);
}
Map<String, Object> tempParamMap = parameterResolver.createParameterMap(tempTest,
tempRow, TableTestParameterResolveMethod.COMBINED, true,
UnresolvableVariableHandling.KEEP_UNRESOLVED);
completeCustomProposalResultValuesInternal(tempResultName, tempMethod,
tempConvertedResultValue, tempParamMap, null, aContext, anAcceptor);
} catch (JavaModelException exc) {
exc.printStackTrace();
} catch (ClassNotFoundException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (UnexecutableException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (InstantiationException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
}
}
}
}
}
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeParameterTableValue_Value(EObject aModel, Assignment anAssignment,
ContentAssistContext aContext, ICompletionProposalAcceptor anAcceptor) {
super.completeParameterTableValue_Value(aModel, anAssignment, aContext, anAcceptor);
if (aModel instanceof ParameterTableValue) {
ParameterTableValue tempParam = (ParameterTableValue) aModel;
TableTestRow tempRow = (TableTestRow) tempParam.eContainer();
TableTest tempTest = (TableTest) tempRow.eContainer();
MethodReference tempMethod = tempTest.getDefinition().getFixtureMethod();
if (tempMethod != null) {
int tempColumn = tempRow.getValues().indexOf(tempParam);
if (tempColumn >= 0 && tempColumn < tempTest.getParameterHeaders().size()) {
try {
Map<String, Object> tempParamMap = parameterResolver.createParameterMap(tempTest, tempRow,
TableTestParameterResolveMethod.COMBINED, true,
UnresolvableVariableHandling.KEEP_UNRESOLVED);
completeParameterValuesInternal(tempTest.getParameterHeaders().get(tempColumn).getName(),
tempMethod, tempParamMap, null, aContext, anAcceptor);
} catch (InstantiationException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (ClassNotFoundException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
} catch (UnexecutableException exc) {
// cannot occur, since thrown by operation execution which is not performed here
exc.printStackTrace();
}
}
}
}
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeSuiteParameter_Name(EObject aModel, Assignment anAssignment,
final ContentAssistContext aContext, final ICompletionProposalAcceptor anAcceptor) {
// filter out everything except suite parameters of the suite that is currently being called
super.completeSuiteParameter_Name(aModel, anAssignment, aContext, new ICompletionProposalAcceptor() {
@Override
public void accept(ICompletionProposal aProposal) {
if (aContext.getCurrentModel() instanceof Suite) {
Suite tempCurrentSuiteCall = (Suite) aContext.getCurrentModel();
SuiteDefinition tempCurrentSuiteDef = (tempCurrentSuiteCall).getDefinition();
if (aProposal instanceof IntegrityConfigurableCompletionProposal) {
SuiteDefinition tempSuiteDef = ((IntegrityConfigurableCompletionProposal) aProposal)
.getSuiteDefiningProposedParameter();
if (tempSuiteDef == tempCurrentSuiteDef) {
ConfigurableCompletionProposal tempProposal = (ConfigurableCompletionProposal) aProposal;
// now filter out the ones that are already present in the call
boolean tempAlreadyUsed = false;
for (SuiteParameter tempAlreadyUsedParam : tempCurrentSuiteCall.getParameters()) {
if (tempProposal.getReplacementString()
.equals(tempAlreadyUsedParam.getName().getName())) {
tempAlreadyUsed = true;
break;
}
}
if (!tempAlreadyUsed) {
tempProposal.setReplacementString(tempProposal.getReplacementString() + ": ");
// For some reason, Xtext doesn't get the cursor positions quite right on these
// proposals, so we calculate them manually here
tempProposal.setCursorPosition(tempProposal.getReplacementString().length());
anAcceptor.accept(aProposal);
}
}
}
}
}
@Override
public boolean canAcceptMoreProposals() {
return anAcceptor.canAcceptMoreProposals();
}
});
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeMethodReference_Method(EObject aModel, Assignment anAssignment,
final ContentAssistContext aContext, final ICompletionProposalAcceptor anAcceptor) {
super.completeMethodReference_Method(aModel, anAssignment, aContext, new ICompletionProposalAcceptor() {
@Override
public boolean canAcceptMoreProposals() {
return anAcceptor.canAcceptMoreProposals();
}
@Override
public void accept(ICompletionProposal aProposal) {
if (aContext.getCurrentModel() instanceof MethodReference) {
MethodReference tempRef = (MethodReference) aContext.getCurrentModel();
if (tempRef.eContainer() instanceof TestDefinition) {
if (aProposal instanceof IntegrityConfigurableCompletionProposal) {
JvmOperation tempOperation = (JvmOperation) ((IntegrityConfigurableCompletionProposal) aProposal)
.getAdditionalProposalInfoObject();
JvmTypeReference tempReturnType = tempOperation.getReturnType();
if (tempReturnType != null && tempReturnType.getType() instanceof JvmVoid) {
// This is a reference to a method which returns nothing. Filter these out!
return;
}
}
}
}
// Not filtered: add this proposal
anAcceptor.accept(aProposal);
}
});
}
@Override
// SUPPRESS CHECKSTYLE MethodName
public void completeSuiteReturn_Name(EObject aModel, Assignment anAssignment, final ContentAssistContext aContext,
final ICompletionProposalAcceptor anAcceptor) {
super.completeSuiteReturn_Name(aModel, anAssignment, aContext, new ICompletionProposalAcceptor() {
@Override
public void accept(ICompletionProposal aProposal) {
anAcceptor.accept(aProposal);
}
@Override
public boolean canAcceptMoreProposals() {
return anAcceptor.canAcceptMoreProposals();
}
});
}
private boolean isCustomProposalFixture(MethodReference aMethod) {
if (aMethod == null) {
return false;
}
for (JvmTypeReference tempRef : aMethod.getMethod().getDeclaringType().getSuperTypes()) {
if (tempRef.getQualifiedName().equals(CustomProposalFixture.class.getName())) {
return true;
}
}
return false;
}
private boolean isArbitraryParameterFixture(MethodReference aMethod) {
if (aMethod == null) {
return false;
}
for (JvmTypeReference tempRef : aMethod.getMethod().getDeclaringType().getSuperTypes()) {
if (tempRef.getQualifiedName().equals(ArbitraryParameterFixture.class.getName())) {
return true;
}
}
return false;
}
private void completeParameterValuesInternal(ParameterName aParameter, MethodReference aMethod,
Map<String, Object> aParamMap, List<String> aParameterPath, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
try {
IType tempJDTType = resolveJDTTypeForJvmType(aMethod.getType());
FixtureTypeWrapper tempFixtureClassWrapper = wrapType(tempJDTType);
CustomProposalProvider tempProposalProvider = tempFixtureClassWrapper.instantiateCustomProposalProvider();
if (tempProposalProvider == null) {
return;
}
resolveVariables(aParamMap);
tempFixtureClassWrapper.convertParameterValuesToFixtureDefinedTypes(aMethod.getMethod().getSimpleName(),
aParamMap, aParameterPath, true);
List<CustomProposalDefinition> tempProposals = tempProposalProvider.defineParameterProposals(
aMethod.getMethod().getSimpleName(),
IntegrityDSLUtil.getParamNameStringFromParameterName(aParameter), aParamMap);
acceptCustomProposals(tempProposals, aContext, anAcceptor);
} catch (JavaModelException exc) {
exc.printStackTrace();
} catch (UnresolvableVariableException exc) {
exc.printStackTrace();
} catch (UnexecutableException exc) {
exc.printStackTrace();
}
}
private void completeCustomProposalResultValuesInternal(ResultName aResult, MethodReference aMethod,
Object aResultValue, Map<String, Object> aParamMap, List<String> aParameterPath,
ContentAssistContext aContext, ICompletionProposalAcceptor anAcceptor) {
try {
IType tempJDTType = resolveJDTTypeForJvmType(aMethod.getType());
FixtureTypeWrapper tempFixtureClassWrapper = wrapType(tempJDTType);
CustomProposalProvider tempProposalProvider = tempFixtureClassWrapper.instantiateCustomProposalProvider();
if (tempProposalProvider == null) {
return;
}
resolveVariables(aParamMap);
tempFixtureClassWrapper.convertParameterValuesToFixtureDefinedTypes(aMethod.getMethod().getSimpleName(),
aParamMap, aParameterPath, true);
List<CustomProposalDefinition> tempProposals = tempProposalProvider.defineResultProposals(
aMethod.getMethod().getSimpleName(),
aResult != null ? IntegrityDSLUtil.getExpectedResultNameStringFromTestResultName(aResult) : null,
aResultValue, aParamMap);
acceptCustomProposals(tempProposals, aContext, anAcceptor);
} catch (JavaModelException exc) {
exc.printStackTrace();
} catch (UnresolvableVariableException exc) {
exc.printStackTrace();
} catch (UnexecutableException exc) {
exc.printStackTrace();
} catch (Throwable exc) {
// This should catch anything else, especially errors in the enumerators' code
Activator.getDefault().getLog().log(new Status(Status.ERROR, "de.gebit.integrity.dsl.ui",
"An exception was caught during custom proposal enumeration", exc));
}
}
private void acceptCustomProposals(List<CustomProposalDefinition> someProposals, ContentAssistContext aContext,
ICompletionProposalAcceptor anAcceptor) {
if (someProposals == null) {
return;
}
for (final CustomProposalDefinition tempProposal : someProposals) {
if (tempProposal.getValue() == null) {
continue;
}
String tempPrefix = "";
if (tempProposal.getDoPrefixFiltering()) {
tempPrefix = aContext.getPrefix();
}
ICompletionProposal tempCompletionProposal = createCompletionProposal(tempProposal.getValue(),
new StyledString(tempProposal.getDisplayValue() != null ? tempProposal.getDisplayValue()
: tempProposal.getValue()),
null, tempProposal.getPriority() + DEFAULT_PROPOSAL_BASE, tempPrefix, aContext);
if (tempCompletionProposal instanceof IntegrityConfigurableCompletionProposal) {
if (tempProposal.getHtmlDescription() != null && isBrowserInformationControlIsAvailable()) {
((IntegrityConfigurableCompletionProposal) tempCompletionProposal)
.setAdditionalProposalInfo(tempProposal.getHtmlDescription());
((IntegrityConfigurableCompletionProposal) tempCompletionProposal)
.setUseHtmlAdditionalProposalInfo(true);
} else if (tempProposal.getPlainDescription() != null) {
((IntegrityConfigurableCompletionProposal) tempCompletionProposal)
.setAdditionalProposalInfo(tempProposal.getPlainDescription());
}
}
anAcceptor.accept(tempCompletionProposal);
}
}
private static boolean isBrowserInformationControlIsAvailable() {
return BrowserInformationControl.isAvailable(Display.getDefault().getActiveShell());
}
private IType resolveJDTTypeForJvmType(JvmType aType) throws JavaModelException {
IJavaElement tempSourceMethod = (IJavaElement) elementFinder.findElementFor(aType);
if (tempSourceMethod.getParent() instanceof CompilationUnit) {
CompilationUnit tempCompilationUnit = (CompilationUnit) tempSourceMethod.getParent();
return tempCompilationUnit.getTypes()[0];
} else if (tempSourceMethod.getParent() instanceof ClassFile) {
ClassFile tempClassFile = (ClassFile) tempSourceMethod.getParent();
tempClassFile.open(null);
return tempClassFile.getType();
}
return null;
}
/**
* Wraps an {@link IType} in a {@link FixtureTypeWrapper}.
*
* @param aType
* the type to wrap
* @return the resulting wrapper instance
*/
protected FixtureTypeWrapper wrapType(IType aType) {
FixtureTypeWrapper tempWrapper = new FixtureTypeWrapper(aType);
injector.injectMembers(tempWrapper);
return tempWrapper;
}
}