Parser detects wrong include files now
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / problem / DefaultProblem.java
index 9e433d3..83d80cf 100644 (file)
@@ -1,38 +1,27 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others.
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v0.5 
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
- ******************************************************************************/
+ *******************************************************************************/
 package net.sourceforge.phpdt.internal.compiler.problem;
-
 import net.sourceforge.phpdt.core.compiler.IProblem;
-import net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit;
 import net.sourceforge.phpdt.internal.compiler.util.Util;
-
 public class DefaultProblem implements ProblemSeverities, IProblem {
-               
        private char[] fileName;
        private int id;
        private int startPosition, endPosition, line;
        private int severity;
        private String[] arguments;
        private String message;
-       
-       public DefaultProblem(
-               char[] originatingFileName,
-               String message,
-               int id,
-               String[] stringArguments,
-               int severity,
-               int startPosition,
-               int endPosition,
-               int line) {
-
+       public DefaultProblem(char[] originatingFileName, String message, int id,
+                       String[] stringArguments, int severity, int startPosition,
+                       int endPosition, int line) {
                this.fileName = originatingFileName;
                this.message = message;
                this.id = id;
@@ -42,200 +31,244 @@ public class DefaultProblem implements ProblemSeverities, IProblem {
                this.endPosition = endPosition;
                this.line = line;
        }
-
-       public String errorReportSource(ICompilationUnit compilationUnit) {
-               //extra from the source the innacurate     token
+       public String errorReportSource(char[] unitSource) {
+               //extra from the source the innacurate token
                //and "highlight" it using some underneath ^^^^^
                //put some context around too.
-
                //this code assumes that the font used in the console is fixed size
-
                //sanity .....
                if ((startPosition > endPosition)
-                       || ((startPosition <= 0) && (endPosition <= 0)))
+                               || ((startPosition < 0) && (endPosition < 0)))
                        return Util.bind("problem.noSourceInformation"); //$NON-NLS-1$
-
+               StringBuffer errorBuffer = new StringBuffer(" "); //$NON-NLS-1$
+               errorBuffer.append(Util.bind("problem.atLine", String.valueOf(line))); //$NON-NLS-1$
+               errorBuffer.append("\n\t"); //$NON-NLS-1$
+               char c;
                final char SPACE = '\u0020';
                final char MARK = '^';
                final char TAB = '\t';
-               char[] source = compilationUnit.getContents();
                //the next code tries to underline the token.....
                //it assumes (for a good display) that token source does not
-               //contain any \r \n. This is false on statements ! 
+               //contain any \r \n. This is false on statements !
                //(the code still works but the display is not optimal !)
-
-               //compute the how-much-char we are displaying around the inaccurate token
-               int begin = startPosition >= source.length ? source.length - 1 : startPosition;
-               int relativeStart = 0;
-               int end = endPosition >= source.length ? source.length - 1 : endPosition;
-               int relativeEnd = 0;
-               label : for (relativeStart = 0;; relativeStart++) {
-                       if (begin == 0)
-                               break label;
-                       if ((source[begin - 1] == '\n') || (source[begin - 1] == '\r'))
-                               break label;
-                       begin--;
+               // expand to line limits
+               int length = unitSource.length, begin, end;
+               for (begin = startPosition >= length ? length - 1 : startPosition; begin > 0; begin--) {
+                       if ((c = unitSource[begin - 1]) == '\n' || c == '\r')
+                               break;
                }
-               label : for (relativeEnd = 0;; relativeEnd++) {
-                       if ((end + 1) >= source.length)
-                               break label;
-                       if ((source[end + 1] == '\r') || (source[end + 1] == '\n')) {
-                               break label;
-                       }
-                       end++;
+               for (end = endPosition >= length ? length - 1 : endPosition; end + 1 < length; end++) {
+                       if ((c = unitSource[end + 1]) == '\r' || c == '\n')
+                               break;
                }
-               //extract the message form the source
-               char[] extract = new char[end - begin + 1];
-               System.arraycopy(source, begin, extract, 0, extract.length);
-               char c;
-               //remove all SPACE and TAB that begin the error message...
-               int trimLeftIndex = 0;
-               while (((c = extract[trimLeftIndex++]) == TAB) || (c == SPACE)) {
-               };
-               System.arraycopy(
-                       extract,
-                       trimLeftIndex - 1,
-                       extract = new char[extract.length - trimLeftIndex + 1],
-                       0,
-                       extract.length);
-               relativeStart -= trimLeftIndex;
-               //buffer spaces and tabs in order to reach the error position
-               int pos = 0;
-               char[] underneath = new char[extract.length]; // can't be bigger
-               for (int i = 0; i <= relativeStart; i++) {
-                       if (extract[i] == TAB) {
-                               underneath[pos++] = TAB;
-                       } else {
-                               underneath[pos++] = SPACE;
-                       }
+               // trim left and right spaces/tabs
+               while ((c = unitSource[begin]) == ' ' || c == '\t')
+                       begin++;
+               //while ((c = unitSource[end]) == ' ' || c == '\t') end--; TODO
+               // (philippe) should also trim right, but all tests are to be updated
+               // copy source
+               errorBuffer.append(unitSource, begin, end - begin + 1);
+               errorBuffer.append("\n\t"); //$NON-NLS-1$
+               // compute underline
+               for (int i = begin; i < startPosition; i++) {
+                       errorBuffer.append((unitSource[i] == TAB) ? TAB : SPACE);
+               }
+               for (int i = startPosition; i <= (endPosition >= length
+                               ? length - 1
+                               : endPosition); i++) {
+                       errorBuffer.append(MARK);
                }
-               //mark the error position
-               for (int i = startPosition;
-                       i <= (endPosition >= source.length ? source.length - 1 : endPosition);
-                       i++)
-                       underneath[pos++] = MARK;
-               //resize underneathto remove 'null' chars
-               System.arraycopy(underneath, 0, underneath = new char[pos], 0, pos);
-
-               return " " + Util.bind("problem.atLine", String.valueOf(line))  //$NON-NLS-2$ //$NON-NLS-1$
-                       + "\n\t" + new String(extract) + "\n\t" + new String(underneath); //$NON-NLS-2$ //$NON-NLS-1$
+               return errorBuffer.toString();
        }
-
+       //      public String errorReportSource(ITextEditor textEditor){
+       // //ICompilationUnit compilationUnit) {
+       //      //extra from the source the innacurate token
+       //              //and "highlight" it using some underneath ^^^^^
+       //              //put some context around too.
+       //
+       //              //this code assumes that the font used in the console is fixed size
+       //
+       //              //sanity .....
+       //              if ((startPosition > endPosition)
+       //                      || ((startPosition <= 0) && (endPosition <= 0)))
+       //                      return ProjectPrefUtil.bind("problem.noSourceInformation"); //$NON-NLS-1$
+       //
+       //              final char SPACE = '\u0020';
+       //              final char MARK = '^';
+       //              final char TAB = '\t';
+       //// char[] source = compilationUnit.getContents();
+       //              char[] source =
+       // textEditor.getDocumentProvider().getDocument(null).get().toCharArray();
+       //              //the next code tries to underline the token.....
+       //              //it assumes (for a good display) that token source does not
+       //              //contain any \r \n. This is false on statements !
+       //              //(the code still works but the display is not optimal !)
+       //
+       //              //compute the how-much-char we are displaying around the inaccurate
+       // token
+       //              int begin = startPosition >= source.length ? source.length - 1 :
+       // startPosition;
+       //              int relativeStart = 0;
+       //              int end = endPosition >= source.length ? source.length - 1 :
+       // endPosition;
+       //              int relativeEnd = 0;
+       //              label : for (relativeStart = 0;; relativeStart++) {
+       //                      if (begin == 0)
+       //                              break label;
+       //                      if ((source[begin - 1] == '\n') || (source[begin - 1] == '\r'))
+       //                              break label;
+       //                      begin--;
+       //              }
+       //              label : for (relativeEnd = 0;; relativeEnd++) {
+       //                      if ((end + 1) >= source.length)
+       //                              break label;
+       //                      if ((source[end + 1] == '\r') || (source[end + 1] == '\n')) {
+       //                              break label;
+       //                      }
+       //                      end++;
+       //              }
+       //              //extract the message form the source
+       //              char[] extract = new char[end - begin + 1];
+       //              System.arraycopy(source, begin, extract, 0, extract.length);
+       //              char c;
+       //              //remove all SPACE and TAB that begin the error message...
+       //              int trimLeftIndex = 0;
+       //              while (((c = extract[trimLeftIndex++]) == TAB) || (c == SPACE)) {
+       //              };
+       //              System.arraycopy(
+       //                      extract,
+       //                      trimLeftIndex - 1,
+       //                      extract = new char[extract.length - trimLeftIndex + 1],
+       //                      0,
+       //                      extract.length);
+       //              relativeStart -= trimLeftIndex;
+       //              //buffer spaces and tabs in order to reach the error position
+       //              int pos = 0;
+       //              char[] underneath = new char[extract.length]; // can't be bigger
+       //              for (int i = 0; i <= relativeStart; i++) {
+       //                      if (extract[i] == TAB) {
+       //                              underneath[pos++] = TAB;
+       //                      } else {
+       //                              underneath[pos++] = SPACE;
+       //                      }
+       //              }
+       //              //mark the error position
+       //              for (int i = startPosition;
+       //                      i <= (endPosition >= source.length ? source.length - 1 : endPosition);
+       //                      i++)
+       //                      underneath[pos++] = MARK;
+       //              //resize underneathto remove 'null' chars
+       //              System.arraycopy(underneath, 0, underneath = new char[pos], 0, pos);
+       //
+       //              return " " + ProjectPrefUtil.bind("problem.atLine", String.valueOf(line))
+       // //$NON-NLS-2$ //$NON-NLS-1$
+       //                      + "\n\t" + new String(extract) + "\n\t" + new String(underneath);
+       // //$NON-NLS-2$ //$NON-NLS-1$
+       //      }
        /**
         * Answer back the original arguments recorded into the problem.
+        * 
         * @return java.lang.String[]
         */
        public String[] getArguments() {
-
                return arguments;
        }
-
        /**
         * Answer the type of problem.
+        * 
         * @see org.eclipse.jdt.core.compiler.IProblem#getID()
         * @return int
         */
        public int getID() {
-
                return id;
        }
-
        /**
-        * Answer a localized, human-readable message string which describes the problem.
+        * Answer a localized, human-readable message string which describes the
+        * problem.
+        * 
         * @return java.lang.String
         */
        public String getMessage() {
-
                return message;
        }
-
        /**
         * Answer the file name in which the problem was found.
+        * 
         * @return char[]
         */
        public char[] getOriginatingFileName() {
-
                return fileName;
        }
-
        /**
         * Answer the end position of the problem (inclusive), or -1 if unknown.
+        * 
         * @return int
         */
        public int getSourceEnd() {
-
                return endPosition;
        }
-
        /**
         * Answer the line number in source where the problem begins.
+        * 
         * @return int
         */
        public int getSourceLineNumber() {
-
                return line;
        }
-
        /**
         * Answer the start position of the problem (inclusive), or -1 if unknown.
+        * 
         * @return int
         */
        public int getSourceStart() {
-
                return startPosition;
        }
-
        /*
         * Helper method: checks the severity to see if the Error bit is set.
         * @return boolean
         */
        public boolean isError() {
-
                return (severity & ProblemSeverities.Error) != 0;
        }
-
        /*
         * Helper method: checks the severity to see if the Error bit is not set.
         * @return boolean
         */
        public boolean isWarning() {
-
                return (severity & ProblemSeverities.Error) == 0;
        }
-
        /**
         * Set the end position of the problem (inclusive), or -1 if unknown.
-        *
+        * 
         * Used for shifting problem positions.
-        * @param sourceEnd the new value of the sourceEnd of the receiver
+        * 
+        * @param sourceEnd
+        *            the new value of the sourceEnd of the receiver
         */
        public void setSourceEnd(int sourceEnd) {
-
                endPosition = sourceEnd;
        }
-
        /**
         * Set the line number in source where the problem begins.
-        * @param lineNumber the new value of the line number of the receiver
+        * 
+        * @param lineNumber
+        *            the new value of the line number of the receiver
         */
        public void setSourceLineNumber(int lineNumber) {
-
                line = lineNumber;
        }
-
        /**
         * Set the start position of the problem (inclusive), or -1 if unknown.
-        *
+        * 
         * Used for shifting problem positions.
-        * @param sourceStart the new value of the source start position of the receiver
+        * 
+        * @param sourceStart
+        *            the new value of the source start position of the receiver
         */
        public void setSourceStart(int sourceStart) {
-
                startPosition = sourceStart;
        }
-
        public String toString() {
-
                String s = "Pb(" + (id & IgnoreCategoriesMask) + ") "; //$NON-NLS-1$ //$NON-NLS-2$
                if (message != null) {
                        s += message;
@@ -246,4 +279,4 @@ public class DefaultProblem implements ProblemSeverities, IProblem {
                }
                return s;
        }
-}
\ No newline at end of file
+}