[jboss-svn-commits] JBL Code SVN: r15660 - in labs/jbossrules/trunk/drools-eclipse: drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Oct 8 14:34:50 EDT 2007
Author: pombredanne
Date: 2007-10-08 14:34:50 -0400 (Mon, 08 Oct 2007)
New Revision: 15660
Modified:
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/CompletionUtil.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ImportCompletionProcessor.java
labs/jbossrules/trunk/drools-eclipse/drools-eclipse-test/src/test/java/org/drools/eclipse/editors/completion/RuleCompletionProcessorTest.java
Log:
Added support for:
*Statics completion om MVEL
*Function arguments completions on functions for Java
*Adding only writable properties to completion proposals in the left hand side of a modify with block expfression for MVEL
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/CompletionUtil.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/CompletionUtil.java 2007-10-08 18:31:50 UTC (rev 15659)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/CompletionUtil.java 2007-10-08 18:34:50 UTC (rev 15660)
@@ -19,6 +19,11 @@
protected static final Pattern MODIFY_PATTERN = Pattern.compile( ".*modify\\s*\\(\\s*(.*)\\s*\\)(\\s*\\{(.*)\\s*\\}?)?",
Pattern.DOTALL );
+ protected static final Pattern START_OF_NEW_JAVA_STATEMENT = Pattern.compile( ".*[;{}]\\s*",
+ Pattern.DOTALL );
+ protected static final Pattern START_OF_METHOD_ARGS = Pattern.compile( ".*[\\(]\\s*",
+ Pattern.DOTALL );
+
private CompletionUtil() {
}
@@ -274,6 +279,49 @@
}
/**
+ * Given a data depicting a method (name, # or params/args, returned type key), tries to return a writable bean property name derived from that method.
+ * If a writable (ie setter) bean property name is not found, the initial method name is returned
+ * @param methodName
+ * @param parameterCount
+ * @param returnType
+ * @return a bean property name
+ */
+ public static String getWritablePropertyName(String methodName,
+ int parameterCount,
+ String returnType) {
+ if ( methodName == null ) {
+ return null;
+ }
+ String simpleName = methodName.replaceAll( "\\(\\)",
+ "" );
+ if ( !isSetter( simpleName,
+ parameterCount,
+ returnType ) ) {
+ return methodName;
+ }
+
+ int prefixLength = 3;
+
+ char firstChar = Character.toLowerCase( simpleName.charAt( prefixLength ) );
+ String propertyName = firstChar + simpleName.substring( prefixLength + 1 );
+ return propertyName;
+ }
+
+ public static String getWritablePropertyName(String methodName,
+ char[] signature) {
+ if ( signature == null || methodName == null ) {
+ return methodName;
+ }
+
+ int parameterCount = Signature.getParameterCount( signature );
+ String returnType = new String( Signature.getReturnType( signature ) );
+
+ return getWritablePropertyName( methodName,
+ parameterCount,
+ returnType );
+ }
+
+ /**
* Determine if the given method is a bean accessor (ie getter/setter)
* @param methodName
* @param actualParameterCount
@@ -324,7 +372,7 @@
String javaTextWithoutPrefix = text.substring( 0,
text.length() - prefix.length() );
- if ( "".equals( javaTextWithoutPrefix.trim() ) || DefaultCompletionProcessor.START_OF_NEW_JAVA_STATEMENT.matcher( javaTextWithoutPrefix ).matches() ) {
+ if ( "".equals( javaTextWithoutPrefix.trim() ) || CompletionUtil.START_OF_NEW_JAVA_STATEMENT.matcher( javaTextWithoutPrefix ).matches() ) {
return true;
}
return false;
@@ -375,4 +423,13 @@
}
return javaTextWithoutPrefix;
}
+
+ public static boolean isStartOfDialectExpression(String text) {
+ return "".equals( text.trim() ) || CompletionUtil.START_OF_NEW_JAVA_STATEMENT.matcher( text ).matches();
+ }
+
+ public static boolean isStartOfMethodArgsExpression(String text) {
+ return CompletionUtil.START_OF_NEW_JAVA_STATEMENT.matcher( text ).matches();
+ }
+
}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java 2007-10-08 18:31:50 UTC (rev 15659)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/DefaultCompletionProcessor.java 2007-10-08 18:34:50 UTC (rev 15660)
@@ -18,6 +18,7 @@
import org.drools.eclipse.editors.DRLRuleEditor;
import org.drools.lang.descr.FactTemplateDescr;
import org.drools.lang.descr.GlobalDescr;
+import org.drools.rule.builder.dialect.java.KnowledgeHelperFixer;
import org.drools.util.StringUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.CompletionContext;
@@ -30,7 +31,6 @@
import org.eclipse.jdt.core.eval.IEvaluationContext;
import org.eclipse.jdt.internal.ui.text.java.AbstractJavaCompletionProposal;
import org.eclipse.jdt.internal.ui.text.java.JavaMethodCompletionProposal;
-import org.eclipse.jdt.internal.ui.text.java.LazyJavaCompletionProposal;
import org.eclipse.jdt.internal.ui.text.java.LazyJavaTypeCompletionProposal;
import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
@@ -66,9 +66,6 @@
protected static final Image METHOD_ICON = DroolsPluginImages.getImage( DroolsPluginImages.METHOD );
protected static final Image CLASS_ICON = DroolsPluginImages.getImage( DroolsPluginImages.CLASS );
- protected static final Pattern START_OF_NEW_JAVA_STATEMENT = Pattern.compile( ".*[;{}]\\s*",
- Pattern.DOTALL );
-
public DefaultCompletionProcessor(AbstractRuleEditor editor) {
super( editor );
}
@@ -261,81 +258,10 @@
return list;
}
- /**
- * @return a list of "MVELified" RuleCompletionProposal. That list contains only unique proposal based on
- * the overrriden equals in {@link RuleCompletionProposal} to avoid the situation when several
- * accessors can exist for one property. for that case we want to keep only one proposal.
- */
- protected Collection getJavaMvelCompletionProposals(final int documentOffset,
- final String javaText,
- final String prefix,
- Map params) {
- final List list = new ArrayList();
- requestJavaCompletionProposals( javaText,
- prefix,
- documentOffset,
- params,
- list );
-
- Collection mvelList = mvelifyProposals( list );
- return mvelList;
- }
-
/*
- * Filters accessor method proposals to replace them with their mvel expression equivalent
- * For instance a completion for getStatus() would be replaced by a completion for status
- */
- private static Collection mvelifyProposals(List list) {
- final Collection set = new HashSet();
-
- for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
- Object o = iter.next();
- if ( o instanceof JavaMethodCompletionProposal ) {
- LazyJavaCompletionProposal javaProposal = (LazyJavaCompletionProposal) o;
- //TODO: FIXME: this is very fragile ass it uses reflection to access the private completion field.
- //Yet this is needed to do mvel filtering based on the method signtures, IF we use the richer JDT completion
- Object field = ReflectionUtils.getField( o,
- "fProposal" );
- if ( field != null && field instanceof CompletionProposal ) {
- CompletionProposal proposal = (CompletionProposal) field;
-
- String completion = new String( proposal.getCompletion() );
-
- // get the eventual property name for that method name and signature
- String propertyOrMethodName = CompletionUtil.getPropertyName( completion,
- proposal.getSignature() );
- //if we got a proeprty name that differs from the orginal method name
- //, this is a a bean accessor
- boolean isAccessor = !completion.equals( propertyOrMethodName );
-
- // is the completion for a bean accessor? and do we have already some relevant completion?
- if ( isAccessor && doesNotContainFieldCompletion( propertyOrMethodName,
- list ) ) {
- //TODO: craft a better JDTish display name
- RuleCompletionProposal prop = new RuleCompletionProposal( javaProposal.getReplacementOffset(),
- javaProposal.getReplacementLength(),
- propertyOrMethodName );
- prop.setImage( DefaultCompletionProcessor.VARIABLE_ICON );
- prop.setPriority( 1000 );
- set.add( prop );
-
- } else {
- set.add( o );
- }
- }
-
- } else {
- //add other proposals as is
- set.add( o );
- }
- }
- return set;
- }
-
- /*
* do we already have a completion for that string that would be either a local variable or a field?
*/
- private static boolean doesNotContainFieldCompletion(String completion,
+ protected static boolean doesNotContainFieldCompletion(String completion,
List completions) {
if ( completion == null || completion.length() == 0 || completions == null ) {
return false;
@@ -362,11 +288,12 @@
Map params,
Collection results) {
+
String javaTextWithoutPrefix = CompletionUtil.getTextWithoutPrefix( javaText,
prefix );
// boolean to filter default Object methods produced by code completion when in the beginning of a statement
boolean filterObjectMethods = false;
- if ( "".equals( javaTextWithoutPrefix.trim() ) || START_OF_NEW_JAVA_STATEMENT.matcher( javaTextWithoutPrefix ).matches() ) {
+ if ( "".equals( javaTextWithoutPrefix.trim() ) || CompletionUtil.START_OF_NEW_JAVA_STATEMENT.matcher( javaTextWithoutPrefix ).matches() ) {
filterObjectMethods = true;
}
IJavaProject javaProject = getCurrentJavaProject();
@@ -393,15 +320,17 @@
}
javaTextWithParams.append( "org.drools.spi.KnowledgeHelper drools;" );
javaTextWithParams.append( javaText );
- String text = javaTextWithParams.toString();
- evalContext.codeComplete( text,
- text.length(),
+ String jtext = javaTextWithParams.toString();
+ String fixedText = new KnowledgeHelperFixer().fix( jtext );
+
+ evalContext.codeComplete( fixedText,
+ fixedText.length(),
collector );
IJavaCompletionProposal[] proposals = collector.getJavaCompletionProposals();
for ( int i = 0; i < proposals.length; i++ ) {
if ( proposals[i] instanceof AbstractJavaCompletionProposal ) {
AbstractJavaCompletionProposal javaProposal = (AbstractJavaCompletionProposal) proposals[i];
- int replacementOffset = documentOffset - (text.length() - javaProposal.getReplacementOffset());
+ int replacementOffset = documentOffset - (fixedText.length() - javaProposal.getReplacementOffset());
javaProposal.setReplacementOffset( replacementOffset );
if ( javaProposal instanceof LazyJavaTypeCompletionProposal ) {
String completionPrefix = javaText.substring( javaText.length() - javaProposal.getReplacementLength() );
@@ -482,8 +411,4 @@
}
return Collections.EMPTY_LIST;
}
-
- protected boolean isStartOfDialectExpression(String text) {
- return "".equals( text.trim() ) || START_OF_NEW_JAVA_STATEMENT.matcher( text ).matches();
- }
}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java 2007-10-08 18:31:50 UTC (rev 15659)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java 2007-10-08 18:34:50 UTC (rev 15660)
@@ -35,6 +35,11 @@
import org.drools.rule.builder.dialect.mvel.MVELDialect;
import org.drools.spi.KnowledgeHelper;
import org.drools.util.asm.ClassFieldInspector;
+import org.eclipse.jdt.core.CompletionProposal;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposal;
+import org.eclipse.jdt.internal.ui.text.java.JavaMethodCompletionProposal;
+import org.eclipse.jdt.internal.ui.text.java.LazyJavaCompletionProposal;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
@@ -133,7 +138,7 @@
context = new CompletionContext( backText );
}
- boolean startOfDialectExpression = isStartOfDialectExpression( consequenceWithoutPrefix );
+ boolean startOfDialectExpression = CompletionUtil.isStartOfDialectExpression( consequenceWithoutPrefix );
if ( isJavaDialect() && startOfDialectExpression ) {
addRHSKeywordCompletionProposals( list,
documentOffset,
@@ -142,6 +147,7 @@
documentOffset,
prefix );
}
+
//if we have 1st a dialect defined locally, or 2nd a global dialect
//the locally defined dialect will override the package default
@@ -960,7 +966,7 @@
String textWithoutPrefix = CompletionUtil.getTextWithoutPrefix( consequenceBackText,
prefix );
- boolean expressionStart = isStartOfDialectExpression( textWithoutPrefix );
+ boolean expressionStart = CompletionUtil.isStartOfDialectExpression( textWithoutPrefix );
boolean isConstrained = textWithoutPrefix.endsWith( "." );
@@ -1001,10 +1007,19 @@
//if constrained, get completion for egress of last inner, filtered on prefix
if ( isConstrained ) {
- return getMvelCompletionsFromJDT( documentOffset,
- "",
- params,
- lastInnerExprContext.getReturnedType() );
+ if ( lastInnerExprContext.isStaticFlag() ) {
+ return getMvelClassCompletionsFromJDT( documentOffset,
+ "",
+ params,
+ lastInnerExprContext.getReturnedType() );
+
+ }
+
+ return getMvelInstanceCompletionsFromJDT( documentOffset,
+ "",
+ params,
+ lastInnerExprContext.getReturnedType(),
+ false );
}
//if expression start inside with block, then get completion for prefix with egrss of modif var + prev expr var&inputs
else if ( expressionStart && isModifyBlock ) {
@@ -1018,29 +1033,30 @@
Class modVarType = modVarContext.getReturnedType();
- Collection modVarComps = getMvelCompletionsFromJDT( documentOffset,
- "",
- params,
- modVarType );
+ Collection modVarComps = getMvelInstanceCompletionsFromJDT( documentOffset,
+ "",
+ params,
+ modVarType,
+ true );
proposals.addAll( modVarComps );
- addMvelCompletions( proposals,
- documentOffset,
- "",
- lastInnerExprContext.getContext().getVariables() );
-
- addMvelCompletions( proposals,
- documentOffset,
- "",
- lastInnerExprContext.getContext().getInputs() );
-
- Collection jdtProps = getJavaCompletionProposals( documentOffset,
- prefix,
- prefix,
- params );
-
- proposals.addAll( jdtProps );
+ // addMvelCompletions( proposals,
+ // documentOffset,
+ // "",
+ // lastInnerExprContext.getContext().getVariables() );
+ //
+ // addMvelCompletions( proposals,
+ // documentOffset,
+ // "",
+ // lastInnerExprContext.getContext().getInputs() );
+ //
+ // Collection jdtProps = getJavaCompletionProposals( documentOffset,
+ // prefix,
+ // prefix,
+ // params );
+ //
+ // proposals.addAll( jdtProps );
return proposals;
}
@@ -1062,7 +1078,6 @@
proposals.addAll( jdtProps );
-
} catch ( Throwable e ) {
DroolsEclipsePlugin.log( e );
}
@@ -1095,6 +1110,7 @@
private CompiledExpression expression;
private ParserContext initialContext;
private Class returnedType;
+ private boolean staticFlag;
public ParserContext getContext() {
if ( getExpression() != null ) {
@@ -1128,6 +1144,14 @@
Class getReturnedType() {
return returnedType;
}
+
+ public boolean isStaticFlag() {
+ return staticFlag;
+ }
+
+ public void setStaticFlag(boolean staticFlag) {
+ this.staticFlag = staticFlag;
+ }
}
private MvelContext analyzeMvelExpression(Map params,
@@ -1155,23 +1179,26 @@
ParserContext compilationContext = compiler.getParserContextState();
Class lastType = expression.getKnownEgressType();
- if ( lastType == null ) {
- lastType = Object.class;
- // mCon.setReturnedType( lastType );
+
+ //Statics expression may return Class as an egress type
+ if ( lastType != null && "java.lang.Class".equals( lastType.getName() ) ) {
+ mCon.setStaticFlag( true );
}
- if ( "java.lang.Object".equals( lastType.getName() ) ) {
+ if ( lastType == null || "java.lang.Object".equals( lastType.getName() ) || "java.lang.Class".equals( lastType.getName() ) ) {
// attempt to use the property verifier to get
// a better type resolution (a recommend by cbrock, though egress gives consistent results)
- //String lastExpression = CompletionUtil.getLastLine( macroMvel );
lastType = new PropertyVerifier( macroMvel,
compilationContext ).analyze();
}
+ if ( lastType == null ) {
+ lastType = Object.class;
+ }
+
mCon.setReturnedType( lastType );
} catch ( Exception e ) {
- //TODO: Log me?
- // DroolsEclipsePlugin.log( e );
+ //do nothing while doing completion.
}
return mCon;
}
@@ -1198,13 +1225,13 @@
return context;
}
- private String processMacros(String mvel) {
+ public static String processMacros(String mvel) {
MVELConsequenceBuilder builder = new MVELConsequenceBuilder();
String macrosProcessedCompilableConsequence = builder.processMacros( mvel.trim() );
return macrosProcessedCompilableConsequence;
}
- private RuleInfo getCurrentRule(DRLInfo drlInfo,
+ private static RuleInfo getCurrentRule(DRLInfo drlInfo,
String currentRulename) {
RuleInfo currentRule = null;
RuleInfo[] ruleInfos = drlInfo.getRuleInfos();
@@ -1217,27 +1244,65 @@
return currentRule;
}
- private Collection getMvelCompletionsFromJDT(final int documentOffset,
- final String prefix,
- Map params,
- Class lastType) {
+ /*
+ * Completions for object instance members
+ */
+ private Collection getMvelInstanceCompletionsFromJDT(final int documentOffset,
+ final String prefix,
+ Map params,
+ Class lastType,
+ boolean settersOnly) {
if ( lastType == null ) {
lastType = Object.class;
}
//FIXME: there is a small chance of var name collision using this arbitrary mvdrlofc as a variable name.
//ideally the variable name should be inferred from the last member of the expression
- String syntheticVarName = "mvdrlofc";
- String javaText = "\n" + lastType.getName().replace( '$',
- '.' ) + " " + syntheticVarName + ";\n" + syntheticVarName + ".";
- Collection jdtProps = getJavaMvelCompletionProposals( documentOffset,
- javaText,
- prefix,
- params );
- return jdtProps;
+ final String syntheticVarName = "mvdrlofc";
+
+ String javaText = "\n" + CompletionUtil.getSimpleClassName( lastType ) + " " + syntheticVarName + ";\n" + syntheticVarName + ".";
+ final List list1 = new ArrayList();
+ requestJavaCompletionProposals( javaText,
+ prefix,
+ documentOffset,
+ params,
+ list1 );
+
+ final List list = list1;
+
+ Collection mvelList = RuleCompletionProcessor.mvelifyProposals( list,
+ settersOnly );
+ return mvelList;
}
- private void addMvelCompletions(final Collection proposals,
+ /*
+ * Completions for static Class members
+ */
+ private Collection getMvelClassCompletionsFromJDT(final int documentOffset,
+ final String prefix,
+ Map params,
+ Class lastType) {
+ if ( lastType == null ) {
+ lastType = Object.class;
+ }
+
+ //FIXME: there is a small chance of var name collision using this arbitrary mvdrlofc as a variable name.
+ //ideally the variable name should be inferred from the last member of the expression
+
+ String javaText = "\n" + CompletionUtil.getSimpleClassName( lastType ) + ".";
+ final List list1 = new ArrayList();
+ requestJavaCompletionProposals( javaText,
+ prefix,
+ documentOffset,
+ params,
+ list1 );
+ final List list = list1;
+ Collection mvelList = RuleCompletionProcessor.mvelifyProposals( list,
+ false );
+ return mvelList;
+ }
+
+ private static void addMvelCompletions(final Collection proposals,
int documentOffset,
String prefix,
Map inputs) {
@@ -1469,4 +1534,109 @@
return true;
}
+ /*
+ * Filters accessor method proposals to replace them with their mvel expression equivalent
+ * For instance a completion for getStatus() would be replaced by a completion for status
+ * when asking for stters only, then only setters or writable fields will be returned
+ */
+ public static Collection mvelifyProposals(List list,
+ boolean settersOnly) {
+ final Collection set = new HashSet();
+
+ for ( Iterator iter = list.iterator(); iter.hasNext(); ) {
+ Object o = iter.next();
+ if ( o instanceof JavaMethodCompletionProposal ) {
+ //methods
+ processJavaMethodCompletionProposal( list,
+ settersOnly,
+ set,
+ o );
+
+ } else if ( o instanceof JavaCompletionProposal ) {
+ //fields
+ processesJavaCompletionProposal( settersOnly,
+ set,
+ o );
+ } else if ( !settersOnly ) {
+ set.add( o );
+ }
+ }
+ return set;
+ }
+
+ private static void processesJavaCompletionProposal(boolean settersOnly,
+ final Collection set,
+ Object o) {
+ if ( settersOnly ) {
+ JavaCompletionProposal jcp = (JavaCompletionProposal) o;
+ //TODO: FIXME: this is very fragile as it uses reflection to access the private completion field.
+ //Yet this is needed to do mvel filtering based on the method signtures, IF we use the richer JDT completion
+ // Object field = ReflectionUtils.getField( o,
+ // "fProposal" );
+ IJavaElement javaElement = jcp.getJavaElement();
+ if ( javaElement.getElementType() == IJavaElement.FIELD ) {
+ set.add( o );
+
+ }
+ } else {
+ set.add( o );
+ }
+ }
+
+ private static void processJavaMethodCompletionProposal(List list,
+ boolean settersOnly,
+ final Collection set,
+ Object o) {
+ LazyJavaCompletionProposal javaProposal = (LazyJavaCompletionProposal) o;
+ //TODO: FIXME: this is very fragile as it uses reflection to access the private completion field.
+ //Yet this is needed to do mvel filtering based on the method signtures, IF we use the richer JDT completion
+ Object field = ReflectionUtils.getField( o,
+ "fProposal" );
+ if ( field != null && field instanceof CompletionProposal ) {
+ CompletionProposal proposal = (CompletionProposal) field;
+
+ String completion = new String( proposal.getCompletion() );
+
+ String propertyOrMethodName = null;
+
+ boolean isSetter = false;
+ boolean isAccessor = false;
+ if ( settersOnly ) {
+ // get the eventual writable property name for that method name and signature
+ propertyOrMethodName = CompletionUtil.getWritablePropertyName( completion,
+ proposal.getSignature() );
+ // if we got a property name that differs from the orginal method name
+ //then this is a bean accessor
+ isSetter = !completion.equals( propertyOrMethodName );
+
+ } else {
+ // get the eventual property name for that method name and signature
+ propertyOrMethodName = CompletionUtil.getPropertyName( completion,
+ proposal.getSignature() );
+ //if we got a property name that differs from the orginal method name
+ //then this is a bean accessor
+ isAccessor = !completion.equals( propertyOrMethodName );
+ }
+
+ // is the completion for a bean accessor? and do we have already some relevant completion?
+ boolean doesNotContainFieldCompletion = DefaultCompletionProcessor.doesNotContainFieldCompletion( propertyOrMethodName,
+ list );
+ if ( ((settersOnly && isSetter) || (!settersOnly && isAccessor)) && doesNotContainFieldCompletion ) {
+
+ //TODO: craft a better JDTish display name than just the property name
+ RuleCompletionProposal prop = new RuleCompletionProposal( javaProposal.getReplacementOffset(),
+ javaProposal.getReplacementLength(),
+ propertyOrMethodName );
+ prop.setImage( DefaultCompletionProcessor.VARIABLE_ICON );
+ //set high priority such that the completion for accessors shows up first
+ prop.setPriority( 1000 );
+ set.add( prop );
+
+ }
+
+ else if ( !settersOnly ) {
+ set.add( o );
+ }
+ }
+ }
}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ImportCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ImportCompletionProcessor.java 2007-10-08 18:31:50 UTC (rev 15659)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/view/property/constraint/ImportCompletionProcessor.java 2007-10-08 18:34:50 UTC (rev 15660)
@@ -17,13 +17,16 @@
*/
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.regex.Matcher;
import org.drools.eclipse.DroolsEclipsePlugin;
import org.drools.eclipse.editors.completion.CompletionUtil;
import org.drools.eclipse.editors.completion.DefaultCompletionProcessor;
+import org.drools.eclipse.editors.completion.RuleCompletionProcessor;
import org.drools.eclipse.editors.completion.RuleCompletionProposal;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
@@ -121,4 +124,24 @@
DefaultCompletionProcessor.filterProposalsOnPrefix(prefix, list);
return list;
}
+
+ /**
+ * @return a list of "MVELified" RuleCompletionProposal. That list contains only unique proposal based on
+ * the overrriden equals in {@link RuleCompletionProposal} to avoid the situation when several
+ * accessors can exist for one property. for that case we want to keep only one proposal.
+ */
+ protected Collection getJavaMvelCompletionProposals(final int documentOffset,
+ final String javaText,
+ final String prefix,
+ Map params) {
+ final List list = new ArrayList();
+ requestJavaCompletionProposals( javaText,
+ prefix,
+ documentOffset,
+ params,
+ list );
+
+ Collection mvelList = RuleCompletionProcessor.mvelifyProposals( list, false );
+ return mvelList;
+ }
}
Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-test/src/test/java/org/drools/eclipse/editors/completion/RuleCompletionProcessorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-test/src/test/java/org/drools/eclipse/editors/completion/RuleCompletionProcessorTest.java 2007-10-08 18:31:50 UTC (rev 15659)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-test/src/test/java/org/drools/eclipse/editors/completion/RuleCompletionProcessorTest.java 2007-10-08 18:34:50 UTC (rev 15660)
@@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.Collection;
+import org.drools.rule.builder.dialect.java.KnowledgeHelperFixer;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContextInformation;
@@ -13,7 +14,9 @@
public class RuleCompletionProcessorTest extends TestCase {
- class MockCompletionProposal implements ICompletionProposal {
+ class MockCompletionProposal
+ implements
+ ICompletionProposal {
String displayString;
@@ -55,37 +58,59 @@
public void testContainsProposal() {
Collection proposals = new ArrayList();
- MockCompletionProposal c1 = new MockCompletionProposal("getName() Object - MyObject");
- proposals.add (c1);
+ MockCompletionProposal c1 = new MockCompletionProposal( "getName() Object - MyObject" );
+ proposals.add( c1 );
- String newProposal ="getName() String - CompletionProposal";
+ String newProposal = "getName() String - CompletionProposal";
- assertTrue(RuleCompletionProcessor.containsProposal( proposals, newProposal ));
+ assertTrue( RuleCompletionProcessor.containsProposal( proposals,
+ newProposal ) );
- MockCompletionProposal c2 = new MockCompletionProposal("getNoName() Object - MyObject");
- proposals.add (c2);
- assertFalse(RuleCompletionProcessor.containsProposal( proposals, "getNoName"));
+ MockCompletionProposal c2 = new MockCompletionProposal( "getNoName() Object - MyObject" );
+ proposals.add( c2 );
+ assertFalse( RuleCompletionProcessor.containsProposal( proposals,
+ "getNoName" ) );
}
public void testAddAllNewProposals() {
ArrayList proposals = new ArrayList();
- MockCompletionProposal c = new MockCompletionProposal("getName() Object - MyObject");
- proposals.add (c);
+ MockCompletionProposal c = new MockCompletionProposal( "getName() Object - MyObject" );
+ proposals.add( c );
-
ArrayList newProposals = new ArrayList();
- MockCompletionProposal c1 = new MockCompletionProposal("getName() Objectw - MyObject");
- newProposals.add (c1);
- MockCompletionProposal c2 = new MockCompletionProposal("getNoName() Object - MyObject");
- newProposals.add (c2);
- MockCompletionProposal c3 = new MockCompletionProposal("getNoName() NoObject - MyObject");
- newProposals.add (c3);
+ MockCompletionProposal c1 = new MockCompletionProposal( "getName() Objectw - MyObject" );
+ newProposals.add( c1 );
+ MockCompletionProposal c2 = new MockCompletionProposal( "getNoName() Object - MyObject" );
+ newProposals.add( c2 );
+ MockCompletionProposal c3 = new MockCompletionProposal( "getNoName() NoObject - MyObject" );
+ newProposals.add( c3 );
- RuleCompletionProcessor.addAllNewProposals( proposals, newProposals );
+ RuleCompletionProcessor.addAllNewProposals( proposals,
+ newProposals );
- assertTrue(proposals.size()==2);
+ assertTrue( proposals.size() == 2 );
ICompletionProposal prop = (ICompletionProposal) proposals.get( 1 );
- assertEquals("getNoName() Object - MyObject", prop.getDisplayString());
+ assertEquals( "getNoName() Object - MyObject",
+ prop.getDisplayString() );
}
+
+ public void testProcessMacros() {
+ String text = "";
+ final String[] functions = new String[]{"update", "retract", "insert", "insertLogical"};
+ for ( int i = 0; i < functions.length; i++ ) {
+ String string = functions[i];
+ String expected = "drools." + string;
+
+ assertEquals( expected,
+ new KnowledgeHelperFixer().fix( string ) );
+
+ }
+ }
+
+ public void testIsStartOfDialectExpression() {
+ String s = "System.out.println(\"\");\r\n" + " update(";
+ assertTrue( CompletionUtil.isStartOfDialectExpression( s ) );
+ }
+
}
More information about the jboss-svn-commits
mailing list