[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