[jbosstools-commits] JBoss Tools SVN: r42444 - trunk/common/plugins/org.jboss.tools.common.validation/src/org/jboss/tools/common/validation/java.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Fri Jul 6 13:59:16 EDT 2012


Author: vrubezhny
Date: 2012-07-06 13:59:16 -0400 (Fri, 06 Jul 2012)
New Revision: 42444

Modified:
   trunk/common/plugins/org.jboss.tools.common.validation/src/org/jboss/tools/common/validation/java/JavaDirtyRegionProcessor.java
Log:
JBIDE-10611
As-you-type CDI validation 

CDI-like validators are invoked if text is changed outside of a method.

Modified: trunk/common/plugins/org.jboss.tools.common.validation/src/org/jboss/tools/common/validation/java/JavaDirtyRegionProcessor.java
===================================================================
--- trunk/common/plugins/org.jboss.tools.common.validation/src/org/jboss/tools/common/validation/java/JavaDirtyRegionProcessor.java	2012-07-06 17:15:52 UTC (rev 42443)
+++ trunk/common/plugins/org.jboss.tools.common.validation/src/org/jboss/tools/common/validation/java/JavaDirtyRegionProcessor.java	2012-07-06 17:59:16 UTC (rev 42444)
@@ -18,6 +18,8 @@
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.compiler.CategorizedProblem;
 import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitDocumentProvider.ProblemAnnotation;
 import org.eclipse.jdt.ui.text.IJavaPartitions;
@@ -31,7 +33,7 @@
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.jface.text.ITypedRegion;
 import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.TypedRegion;
+import org.eclipse.jface.text.Region;
 import org.eclipse.jface.text.reconciler.DirtyRegion;
 import org.eclipse.jface.text.source.Annotation;
 import org.eclipse.jface.text.source.IAnnotationModel;
@@ -60,7 +62,6 @@
 @SuppressWarnings("restriction")
 final public class JavaDirtyRegionProcessor extends
 			DirtyRegionProcessor {
-
 	/**
 	 * This constant is put as value to JavaELProblemReporter.fAnnotations(Annotation, Position)
 	 * to indicate that in JavaELProblemReporter.clearAnnotations(int start, int end)
@@ -78,9 +79,10 @@
 	private boolean fInRewriteSession = false;
 	private IDocumentRewriteSessionListener fDocumentRewriteSessionListener = new DocumentRewriteSessionListener();
 	private Set<ITypedRegion> fPartitionsToProcess = new HashSet<ITypedRegion>();
-	private boolean fDoJavaElementProcessing = false;
 	private int fStartPartitionsToProcess = -1;
 	private int fEndPartitionsToProcess = -1;
+	private int fStartRegionToProcess = -1;
+	private int fEndRegionToProcess = -1;
 
 	// AsYouType EL Validation 'marker type' name. 
 	// marker type is used in the quickFixProcessor extension point
@@ -148,6 +150,10 @@
 			return fAnnotationModel;
 		}
 
+		public ICompilationUnit getCompilationUnit() {
+			return fCompilationUnit;
+		}
+		
 		private void clearAllAnnotations() {
 			if (fAnnotations.isEmpty()) {
 				return;
@@ -479,9 +485,10 @@
 	@Override
 	protected void beginProcessing() {
 		fPartitionsToProcess.clear();
+		fStartRegionToProcess = -1;
+		fEndRegionToProcess = -1;
 		fStartPartitionsToProcess = -1;
 		fEndPartitionsToProcess = -1;
-		fDoJavaElementProcessing = false;
 	}
 
 	protected void process(DirtyRegion dirtyRegion) {
@@ -502,6 +509,9 @@
 			start = docLen;
 		if (end >= docLen) 
 			end = docLen - 1;
+
+		fStartRegionToProcess = (fStartRegionToProcess == -1 || fStartRegionToProcess > start) ? start : fStartRegionToProcess;
+		fEndRegionToProcess = (fEndRegionToProcess == -1 || fEndRegionToProcess < end) ? end : fEndRegionToProcess;
 		
 		/*
 		 * Expand dirtyRegion to partitions boundaries 
@@ -537,32 +547,69 @@
 				if (IJavaPartitions.JAVA_STRING.equals(partition.getType()) && !fPartitionsToProcess.contains(partition)) {
 					fPartitionsToProcess.add(partition);
 				}
-				
-				fDoJavaElementProcessing |= isJavaElementPartition(partition);
 			}
 		}
 	}
 
 	@Override
 	protected void endProcessing() {
-		if (fValidatorManager == null || fPartitionsToProcess.isEmpty() || fStartPartitionsToProcess == -1 || fEndPartitionsToProcess == -1) 
+		if (fValidatorManager == null || fReporter == null || fStartPartitionsToProcess == -1 || fEndPartitionsToProcess == -1) 
 			return;
 		
-		if (fReporter != null) {
-			fReporter.clearAnnotations(fStartPartitionsToProcess, fEndPartitionsToProcess);
-		}
+		fReporter.clearAnnotations(fStartPartitionsToProcess, fEndPartitionsToProcess);
+
 		for (ITypedRegion partition : fPartitionsToProcess) {
 			fValidatorManager.validateString(partition, fHelper, fReporter);
 		}
 		
-		if (fDoJavaElementProcessing) {
-			ITypedRegion partition = new TypedRegion(fStartPartitionsToProcess, fEndPartitionsToProcess - fStartPartitionsToProcess, IJavaPartitions.JAVA_PARTITIONING);
-			fValidatorManager.validateJavaElement(partition, fHelper, fReporter);			
+		if (isJavaElementValidationRequired(fStartRegionToProcess, fEndRegionToProcess)) {
+			fValidatorManager.validateJavaElement(new Region(fStartPartitionsToProcess, fEndPartitionsToProcess - fStartPartitionsToProcess), fHelper, fReporter);			
 		}
 	}
 	
-	private boolean isJavaElementPartition(ITypedRegion partition) {
-		return true;
+	private boolean isJavaElementValidationRequired(int start, int end) {
+		ICompilationUnit unit = fReporter.getCompilationUnit();
+		if (unit == null)
+			return false;
+		
+		boolean result = false;
+		boolean atLeastOneElementIsProcessed = false;
+		int position = start;
+		try {
+			IJavaElement element = null;
+			while (position >= 0 && (element = unit.getElementAt(position--)) == null)
+				;
+			
+			if (position < 0)
+				position = 0;
+
+			while (position < end) {
+				element = unit.getElementAt(position++);
+				if (element != null) {
+					atLeastOneElementIsProcessed = true;
+					if (element.getElementType() == IJavaElement.METHOD)
+						continue;
+
+					IJavaElement parent = element.getParent();
+					boolean doSkipThisElement = false;
+					while (parent != null && parent.getElementType() != IJavaElement.COMPILATION_UNIT) {
+						if (parent.getElementType() == IJavaElement.METHOD) {
+							doSkipThisElement = true;
+							break;
+						}
+						parent = parent.getParent();
+					}
+					
+					if (!doSkipThisElement) 
+						return true;
+				}
+			}
+		} catch (JavaModelException e) {
+			LogHelper.logError(CommonValidationPlugin.getDefault(), e);
+		}
+		
+		result = atLeastOneElementIsProcessed ? result : true;
+		return result ;
 	}
 	
 }
\ No newline at end of file



More information about the jbosstools-commits mailing list