[jboss-svn-commits] JBL Code SVN: r13091 - in labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors: completion and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jul 4 18:08:45 EDT 2007


Author: KrisVerlaenen
Date: 2007-07-04 18:08:44 -0400 (Wed, 04 Jul 2007)
New Revision: 13091

Modified:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/LocationDeterminator.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java
Log:
JBRULES-973: Add code completion support for new 4.0 features
 - added support for this, [], nested properties and accumulate functions
Classes in the same package as this rule also recognized by code completion

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java	2007-07-04 19:30:41 UTC (rev 13090)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/DRLRuleEditor.java	2007-07-04 22:08:44 UTC (rev 13091)
@@ -166,6 +166,9 @@
             // imports
             List allImports = descr.getImports();
             this.imports = new ArrayList();
+            if (packageName != null) {
+                imports.addAll(getAllClassesInPackage(packageName));
+            }
             Iterator iterator = allImports.iterator();
             while (iterator.hasNext()) {
                 String importName = ((ImportDescr) iterator.next()).getTarget();

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/LocationDeterminator.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/LocationDeterminator.java	2007-07-04 19:30:41 UTC (rev 13090)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/LocationDeterminator.java	2007-07-04 22:08:44 UTC (rev 13091)
@@ -15,7 +15,7 @@
 
 //    private static final Pattern PATTERN_PATTERN_START               = Pattern.compile( ".*[(,](\\s*(\\S*)\\s*:)?\\s*[^\\s<>!=:]*",
 //                                                                                Pattern.DOTALL );
-    static final Pattern PATTERN_PATTERN_OPERATOR            = Pattern.compile( ".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:\\(\\)]+)(\\s*([<>=!]+)\\s*[^\\s<>!=:]*\\s*(&&|\\|\\|))*\\s+",
+    static final Pattern PATTERN_PATTERN_OPERATOR            = Pattern.compile( ".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:\\(\\),]+)(\\s*([<>=!]+)\\s*[^\\s<>!=:]*\\s*(&&|\\|\\|))*\\s+",
                                                                                 Pattern.DOTALL );
 //    private static final Pattern PATTERN_PATTERN_CONTAINS_ARGUMENT   = Pattern.compile( ".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:\\(\\)]+)\\s+contains\\s+[^\\s<>!=:]*",
 //                                                                                Pattern.DOTALL );

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-07-04 19:30:41 UTC (rev 13090)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/editors/completion/RuleCompletionProcessor.java	2007-07-04 22:08:44 UTC (rev 13091)
@@ -10,19 +10,18 @@
 import org.drools.base.ClassTypeResolver;
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsParserException;
+import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.eclipse.DroolsEclipsePlugin;
 import org.drools.eclipse.DroolsPluginImages;
 import org.drools.eclipse.editors.AbstractRuleEditor;
 import org.drools.eclipse.util.ProjectClassLoader;
 import org.drools.lang.Location;
-import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.BaseDescr;
 import org.drools.lang.descr.ExistsDescr;
 import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FieldBindingDescr;
 import org.drools.lang.descr.FieldTemplateDescr;
-import org.drools.lang.descr.FromDescr;
 import org.drools.lang.descr.GlobalDescr;
 import org.drools.lang.descr.NotDescr;
 import org.drools.lang.descr.OrDescr;
@@ -173,6 +172,8 @@
 		case Location.LOCATION_LHS_INSIDE_CONDITION_START:
 			String className = (String) location
 					.getProperty(Location.LOCATION_PROPERTY_CLASS_NAME);
+			String propertyName = (String) location
+					.getProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME);
 			if (className != null) {
 				boolean isTemplate = addFactTemplatePropertyProposals(
 						prefix, className, list);
@@ -181,17 +182,47 @@
 							getImports(), ProjectClassLoader
 									.getProjectClassLoader(getEditor()));
 					try {
-						Class clazz = resolver.resolveType(className);
+						String currentClass = className;
+						if (propertyName != null) {
+							String[] nestedProperties = propertyName.split("\\.");
+							int nbSuperProperties = nestedProperties.length - 1;
+							if (propertyName.endsWith(".")) {
+								nbSuperProperties++;
+							}
+							for (int i = 0; i < nbSuperProperties; i++) {
+								String simplePropertyName = nestedProperties[i];
+								currentClass = getSimplePropertyClass(currentClass, simplePropertyName);
+								currentClass = convertToNonPrimitiveClass(currentClass);
+							}
+						}
+						RuleCompletionProposal p = new RuleCompletionProposal(prefix.length(), "this");
+							p.setImage(METHOD_ICON);
+							list.add(p);
+						Class clazz = resolver.resolveType(currentClass);
 						if (clazz != null) {
-							Iterator iterator2 = new ClassFieldInspector(
-									clazz).getFieldNames().keySet()
-									.iterator();
+							if (Map.class.isAssignableFrom(clazz)) {
+								p = new RuleCompletionProposal(
+									prefix.length(), "this['']", "this['']", 6);
+								p.setImage(METHOD_ICON);
+								list.add(p);
+							}
+							ClassFieldInspector inspector = new ClassFieldInspector(clazz);
+							Map types = inspector.getFieldTypes();
+							Iterator iterator2 = inspector.getFieldNames().keySet().iterator();
 							while (iterator2.hasNext()) {
 								String name = (String) iterator2.next();
-								RuleCompletionProposal p = new RuleCompletionProposal(
+								p = new RuleCompletionProposal(
 										prefix.length(), name, name + " ");
 								p.setImage(METHOD_ICON);
 								list.add(p);
+								Class type = (Class) types.get(name);
+								if (type != null && Map.class.isAssignableFrom(type)) {
+									name += "['']";
+									p = new RuleCompletionProposal(
+										prefix.length(), name, name, name.length() - 2);
+									p.setImage(METHOD_ICON);
+									list.add(p);
+								}
 							}
 						}
 					} catch (IOException exc) {
@@ -363,6 +394,17 @@
 								"accumulate",
 								"accumulate (  , init (  ), action (  ), result (  ) )",
 								13, DROOLS_ICON));
+				PackageBuilderConfiguration config = new PackageBuilderConfiguration(
+					ProjectClassLoader.getProjectClassLoader(getEditor()), null);
+				Map accumulateFunctions = config.getAccumulateFunctionsMap();
+				for (Iterator iterator2 = accumulateFunctions.keySet().iterator(); iterator2.hasNext(); ) {
+					String accumulateFunction = (String) iterator2.next();
+					list.add(new RuleCompletionProposal(
+							prefix.length(),
+							"accumulate " + accumulateFunction,
+							"accumulate (  , " + accumulateFunction + "(  ) )",
+							13, DROOLS_ICON));
+				}
 				list.add(new RuleCompletionProposal(prefix.length(),
 						"collect", "collect (  )", 10, DROOLS_ICON));
 				// add all functions
@@ -438,27 +480,45 @@
 				}
 				// if not found, return null
 			} else {
-				ClassTypeResolver resolver = new ClassTypeResolver(
-						getImports(), ProjectClassLoader
-								.getProjectClassLoader(getEditor()));
-				try {
-					Class clazz = resolver.resolveType(className);
-					if (clazz != null) {
-						Class clazzz = (Class) new ClassFieldInspector(clazz)
-								.getFieldTypes().get(propertyName);
-						if (clazzz != null) {
-							return clazzz.getName();
-						}
-					}
-				} catch (IOException exc) {
-					// Do nothing
-				} catch (ClassNotFoundException exc) {
-					// Do nothing
+				String[] nestedProperties = propertyName.split("\\.");
+				String currentClass = className;
+				for (int i = 0; i < nestedProperties.length; i++) {
+					String simplePropertyName = nestedProperties[i];
+					currentClass = getSimplePropertyClass(currentClass, simplePropertyName);
 				}
+				return currentClass; 
 			}
 		}
 		return null;
 	}
+	
+	private String getSimplePropertyClass(String className, String propertyName) {
+		if ("this".equals(propertyName)) {
+			return className;
+		}
+		if (propertyName.endsWith("]")) {
+			// TODO can we take advantage of generics here?
+			return "java.lang.Object";
+		}
+		ClassTypeResolver resolver = new ClassTypeResolver(
+			getImports(), ProjectClassLoader
+				.getProjectClassLoader(getEditor()));
+		try {
+			Class clazz = resolver.resolveType(className);
+			if (clazz != null) {
+				Class clazzz = (Class) new ClassFieldInspector(clazz)
+						.getFieldTypes().get(propertyName);
+				if (clazzz != null) {
+					return clazzz.getName();
+				}
+			}
+		} catch (IOException exc) {
+			// Do nothing
+		} catch (ClassNotFoundException exc) {
+			// Do nothing
+		}
+		return "java.lang.Object";
+	}
 
 	private Map getRuleParameters(String backText) {
 		Map result = new HashMap();
@@ -646,16 +706,7 @@
 			getRuleParameters(result, ((ExistsDescr) descr).getDescrs());
 		} else if (descr instanceof NotDescr) {
 			getRuleParameters(result, ((NotDescr) descr).getDescrs());
-		} else if (descr instanceof FromDescr) {
-			getRuleParameters(result, ((FromDescr) descr).getDescrs());
-		} else if (descr instanceof AccumulateDescr) {
-			AccumulateDescr accumulateDescr = (AccumulateDescr) descr;
-			getRuleParameters(result, accumulateDescr.getInputPattern());
-			if (accumulateDescr.getInputPattern() != null) {
-				getRuleParameters(result, accumulateDescr.getInputPattern());
-			}
 		}
-
 	}
 
 	private void getRuleSubParameters(Map result, List descrs, String clazz) {




More information about the jboss-svn-commits mailing list