[jboss-svn-commits] JBL Code SVN: r5482 - labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Aug 4 18:04:06 EDT 2006


Author: KrisVerlaenen
Date: 2006-08-04 18:04:05 -0400 (Fri, 04 Aug 2006)
New Revision: 5482

Modified:
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java
Log:
JBRULES-282: Funny newlines break folding
 - refactoring of folding should remove this issue

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java	2006-08-04 22:03:32 UTC (rev 5481)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java	2006-08-04 22:04:05 UTC (rev 5482)
@@ -1,8 +1,5 @@
 package org.drools.ide.editors;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -27,11 +24,10 @@
 
 public class DRLReconcilingStrategy implements IReconcilingStrategy {
 
-    private static final Pattern RULE_PATTERN = Pattern.compile("\\s*rule\\s+\"?([^\"]+)\"?.*", Pattern.DOTALL);
-    private static final Pattern QUERY_PATTERN = Pattern.compile("\\s*query\\s+\"?([^\"]+)\"?.*", Pattern.DOTALL);
-    private static final Pattern FUNCTION_PATTERN = Pattern.compile("\\s*function\\s+(.*)\\s+(.*)\\(.*\\).*", Pattern.DOTALL);
-    private static final Pattern END_PATTERN = Pattern.compile("\\s*end.*", Pattern.DOTALL);
-    private static final Pattern IMPORT_PATTERN = Pattern.compile("\\s*import\\s.*", Pattern.DOTALL);
+    private static final Pattern RULE_PATTERN = Pattern.compile("\\n\\s*(rule\\s+.*?\\n\\s*end)", Pattern.DOTALL);
+    private static final Pattern QUERY_PATTERN = Pattern.compile("\\n\\s*(query\\s+.*?\\n\\s*end)", Pattern.DOTALL);
+    private static final Pattern FUNCTION_PATTERN = Pattern.compile("\\n\\s*(function\\s+[^\\{]*\\{)", Pattern.DOTALL);
+    private static final Pattern IMPORT_PATTERN = Pattern.compile("\\n\\s*((\\s*import\\s+[^\\s;]+;?[\\t\\x0B\\f\\r]*\\n)+)", Pattern.DOTALL);
     
 	private ISourceViewer sourceViewer;
 	private DRLRuleEditor editor;
@@ -111,109 +107,39 @@
     protected void calculateFolding(String input) {
     	// TODO replace this parsing by getting this input from the parsed rule file
     	final List positions = new ArrayList();
-        StringReader stringReader = new StringReader( input );
-        BufferedReader bufferedReader = new BufferedReader( stringReader );
-        try {
-            int offset = 0;
-            String st = bufferedReader.readLine();
-            int start = -1;
-            while ( st != null ) {
-                Matcher matcher = RULE_PATTERN.matcher(st);
-                if (matcher.matches()) {
-                	start = offset + matcher.start();
-                	offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-                    st = bufferedReader.readLine();
-                	while (st != null) {
-                		Matcher matcher2 = END_PATTERN.matcher(st);
-                		if (matcher2.matches()) {
-                			int end = offset + matcher2.end();
-                            offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-                            st = bufferedReader.readLine();
-                			positions.add(new Position(start, end - start + (st == null ? 0 : System.getProperty("line.separator").length()))); // + for the newline
-                			break;
-                		}
-                        offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-                        st = bufferedReader.readLine();
-	                }
-                } else {
-                	matcher = QUERY_PATTERN.matcher(st);
-                    if (matcher.matches()) {
-                    	start = offset + matcher.start();
-                    	offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-                        st = bufferedReader.readLine();
-                    	while (st != null) {
-                    		Matcher matcher2 = END_PATTERN.matcher(st);
-                    		if (matcher2.matches()) {
-                    			int end = offset + matcher2.end();
-                                offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-                                st = bufferedReader.readLine();
-                    			positions.add(new Position(start, end - start + (st == null ? 0 : System.getProperty("line.separator").length()))); // + for the newline
-                    			break;
-                    		}
-                            offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-                            st = bufferedReader.readLine();
-    	                }
-                    } else {
-	                	matcher = FUNCTION_PATTERN.matcher(st);
-	                    if (matcher.matches()) {
-	                    	start = offset + matcher.start();
-	                    	int nbOpenBrackets = 1;
-	                    	offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-                            st = bufferedReader.readLine();
-	                    	while (st != null) {
-	                    		byte[] bytes = st.getBytes();
-	                    		for (int i = 0; i < bytes.length; i++) {
-	                    			if (bytes[i] == '{') {
-	                    				nbOpenBrackets++;
-	                    			} else if (bytes[i] == '}') {
-	                    				if (--nbOpenBrackets == 0) {
-	    	                    			int end = offset + i + 1;
-	    		                            offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-	    		                            st = bufferedReader.readLine();
-	    	                    			positions.add(new Position(start, end - start + (st == null ? 0 : System.getProperty("line.separator").length()))); // + for the newline
-	    	                    			break;
-	                    				}
-	                    			}
-	                    		}
-	                    		if (nbOpenBrackets == 0) {
-	                    			break;
-	                    		}
-	                            offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-	                            st = bufferedReader.readLine();
-	    	                }
-	                    } else {
-		                	matcher = IMPORT_PATTERN.matcher(st);
-		                    if (matcher.matches()) {
-		                    	start = offset + matcher.start();
-		                    	offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-	                            st = bufferedReader.readLine();
-		                    	while (st != null) {
-		                    		Matcher matcher2 = IMPORT_PATTERN.matcher(st);
-		                    		if (!matcher2.matches()) {
-		                    			int end = offset;
-		                    			positions.add(new Position(start, end - start));
-		                    			break;
-		                    		}
-		                            offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-		                            st = bufferedReader.readLine();
-		    	                }
-		                    } else {
-		                    	offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
-	                            st = bufferedReader.readLine();
-		                    }
-	                    }
-                    }
-                }
-            }
-        } catch ( IOException e ) {
-        	// do nothing
+        Matcher matcher = RULE_PATTERN.matcher(input);
+        while (matcher.find()) {
+			positions.add(new Position(matcher.start(1), matcher.end(1) - matcher.start(1)));
         }
-
+        matcher = QUERY_PATTERN.matcher(input);
+        while (matcher.find()) {
+			positions.add(new Position(matcher.start(1), matcher.end(1) - matcher.start(1)));
+        }
+        matcher = IMPORT_PATTERN.matcher(input);
+        while (matcher.find()) {
+			positions.add(new Position(matcher.start(1), matcher.end(1) - matcher.start(1)));
+        }
+        matcher = FUNCTION_PATTERN.matcher(input);
+        while (matcher.find()) {
+        	int start = matcher.start(1);
+        	// TODO also take comments, strings etc. in consideration
+        	// use JavaPairMatcher or similar
+        	int nbOpenBrackets = 1;
+        	for (int i = matcher.end(); i < input.length(); i++) {
+    			if (input.charAt(i) == '{') {
+    				nbOpenBrackets++;
+    			} else if (input.charAt(i) == '}') {
+    				if (--nbOpenBrackets == 0) {
+            			positions.add(new Position(start, i - start + 1));
+            			break;
+    				}
+    			}
+        	}
+        }
 		Display.getDefault().asyncExec(new Runnable() {
 			public void run() {
 				editor.updateFoldingStructure(positions);
 			}
 		});
 	}
-
 }
\ No newline at end of file




More information about the jboss-svn-commits mailing list