Fixed bug #1404228: Crash on <?php // comment ?>
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / ui / text / PHPSourceViewerConfiguration.java
index d5e5073..d749720 100644 (file)
@@ -7,7 +7,7 @@
 
  Contributors:
  IBM Corporation - Initial implementation
- Klaus Hartlage - www.eclipseproject.de
+ www.phpeclipse.de
  **********************************************************************/
 package net.sourceforge.phpdt.ui.text;
 
@@ -37,7 +37,6 @@ import net.sourceforge.phpdt.internal.ui.text.phpdoc.PHPDocCompletionProcessor;
 import net.sourceforge.phpdt.ui.PreferenceConstants;
 import net.sourceforge.phpeclipse.IPreferenceConstants;
 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
-import net.sourceforge.phpeclipse.phpeditor.html.HTMLFormattingStrategy;
 import net.sourceforge.phpeclipse.phpeditor.php.HTMLCompletionProcessor;
 import net.sourceforge.phpeclipse.phpeditor.php.PHPAutoIndentStrategy;
 import net.sourceforge.phpeclipse.phpeditor.php.PHPCodeScanner;
@@ -98,14 +97,14 @@ import org.eclipse.ui.texteditor.ITextEditor;
 public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   /**
    * Preference key used to look up display tab width.
-   * 
+   *
    * @since 2.0
    */
   public final static String PREFERENCE_TAB_WIDTH = PreferenceConstants.EDITOR_TAB_WIDTH;
 
   /**
    * Preference key for inserting spaces rather than tabs.
-   * 
+   *
    * @since 2.0
    */
   public final static String SPACES_FOR_TABS = PreferenceConstants.EDITOR_SPACES_FOR_TABS;
@@ -113,21 +112,19 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   //  public static final String HTML_DEFAULT =
   // IPHPPartitionScannerConstants.HTML;
   //IDocument.DEFAULT_CONTENT_TYPE;
-  private JavaTextTools fJavaTextTools;
+//  private JavaTextTools fJavaTextTools;
 
   private ITextEditor fTextEditor;
 
   /**
    * The document partitioning.
-   * 
+   *
    * @since 3.0
    */
   private String fDocumentPartitioning;
 
   private ContentFormatter fFormatter;
 
-  private HTMLFormattingStrategy fFormattingStrategy;
-
   /**
    * Single token scanner.
    */
@@ -139,55 +136,57 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * The document partitioning.
-   * 
+   *
    * @since 3.0
    */
   //  private String fDocumentPartitioning;
   /**
    * The Java source code scanner
-   * 
+   *
    * @since 3.0
    */
   private AbstractJavaScanner fCodeScanner;
 
   /**
    * The Java multi-line comment scanner
-   * 
+   *
    * @since 3.0
    */
   private AbstractJavaScanner fMultilineCommentScanner;
 
   /**
    * The Java single-line comment scanner
-   * 
+   *
    * @since 3.0
    */
   private AbstractJavaScanner fSinglelineCommentScanner;
 
   /**
-   * The Java string scanner
-   * 
-   * @since 3.0
+   * The PHP double quoted string scanner
+   */
+  private AbstractJavaScanner fStringDQScanner;
+  /**
+   * The PHP single quoted string scanner
    */
-  private AbstractJavaScanner fStringScanner;
+  private AbstractJavaScanner fStringSQScanner;
 
   /**
    * The Javadoc scanner
-   * 
+   *
    * @since 3.0
    */
   private AbstractJavaScanner fJavaDocScanner;
 
   /**
    * The preference store, can be read-only
-   * 
+   *
    * @since 3.0
    */
   private IPreferenceStore fPreferenceStore;
 
   /**
    * The color manager
-   * 
+   *
    * @since 3.0
    */
   private IColorManager fColorManager;
@@ -204,7 +203,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
    * {@link JavaSourceViewerConfiguration#handlePropertyChangeEvent(PropertyChangeEvent)}and disallowed to call
    * {@link JavaSourceViewerConfiguration#getPreferenceStore()}on the resulting Java source viewer configuration.
    * </p>
-   * 
+   *
    * @param colorManager
    *          the color manager
    * @param preferenceStore
@@ -234,7 +233,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * Creates a new Java source viewer configuration for viewers in the given editor using the given Java tools.
-   * 
+   *
    * @param tools
    *          the Java text tools to be used
    * @param editor
@@ -251,7 +250,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   //    fCodeScanner = (AbstractJavaScanner) fJavaTextTools.getCodeScanner();
   //    fMultilineCommentScanner = (AbstractJavaScanner) fJavaTextTools.getMultilineCommentScanner();
   //    fSinglelineCommentScanner = (AbstractJavaScanner) fJavaTextTools.getSinglelineCommentScanner();
-  //    fStringScanner = (AbstractJavaScanner) fJavaTextTools.getStringScanner();
+  //    fStringDQScanner = (AbstractJavaScanner) fJavaTextTools.getStringScanner();
   //    fJavaDocScanner = (AbstractJavaScanner) fJavaTextTools.getJavaDocScanner();
   //    fTextEditor = editor;
   //    fXMLTextTools = XMLPlugin.getDefault().getXMLTextTools();
@@ -259,7 +258,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   //  }
   /**
    * Returns the color manager for this configuration.
-   * 
+   *
    * @return the color manager
    */
   protected IColorManager getColorManager() {
@@ -268,23 +267,25 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * Initializes the scanners.
-   * 
+   *
    * @since 3.0
    */
   private void initializeScanners() {
-    Assert.isTrue(isNewSetup());
+//    Assert.isTrue(isNewSetup());
     fCodeScanner = new PHPCodeScanner(getColorManager(), fPreferenceStore);
     fMultilineCommentScanner = new SingleTokenPHPScanner(getColorManager(), fPreferenceStore,
         IPreferenceConstants.PHP_MULTILINE_COMMENT);
     fSinglelineCommentScanner = new SingleTokenPHPScanner(getColorManager(), fPreferenceStore,
         IPreferenceConstants.PHP_SINGLELINE_COMMENT);
-    fStringScanner = new SingleTokenPHPScanner(getColorManager(), fPreferenceStore, IPreferenceConstants.PHP_STRING);
+//    fStringDQScanner = new SingleTokenPHPScanner(getColorManager(), fPreferenceStore, IPreferenceConstants.PHP_STRING_DQ);
+    fStringDQScanner = new PHPStringDQCodeScanner(getColorManager(), fPreferenceStore);
+    fStringSQScanner = new SingleTokenPHPScanner(getColorManager(), fPreferenceStore, IPreferenceConstants.PHP_STRING_SQ);
     fJavaDocScanner = new PHPDocCodeScanner(getColorManager(), fPreferenceStore);
   }
 
   /**
    * Determines whether the preference change encoded by the given event changes the behavior of one of its contained components.
-   * 
+   *
    * @param event
    *          the event to be investigated
    * @return <code>true</code> if event causes a behavioral change
@@ -292,7 +293,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
    */
   public boolean affectsTextPresentation(PropertyChangeEvent event) {
     return fCodeScanner.affectsBehavior(event) || fMultilineCommentScanner.affectsBehavior(event)
-        || fSinglelineCommentScanner.affectsBehavior(event) || fStringScanner.affectsBehavior(event)
+        || fSinglelineCommentScanner.affectsBehavior(event) || fStringDQScanner.affectsBehavior(event)|| fStringSQScanner.affectsBehavior(event)
         || fJavaDocScanner.affectsBehavior(event);
   }
 
@@ -301,22 +302,24 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
    * <p>
    * Clients are not allowed to call this method if the old setup with text tools is in use.
    * </p>
-   * 
+   *
    * @param event
    *          the event to which to adapt
    * @see JavaSourceViewerConfiguration#JavaSourceViewerConfiguration(IColorManager, IPreferenceStore, ITextEditor, String)
    * @since 3.0
    */
   public void handlePropertyChangeEvent(PropertyChangeEvent event) {
-    Assert.isTrue(isNewSetup());
+//    Assert.isTrue(isNewSetup());
     if (fCodeScanner.affectsBehavior(event))
       fCodeScanner.adaptToPreferenceChange(event);
     if (fMultilineCommentScanner.affectsBehavior(event))
       fMultilineCommentScanner.adaptToPreferenceChange(event);
     if (fSinglelineCommentScanner.affectsBehavior(event))
       fSinglelineCommentScanner.adaptToPreferenceChange(event);
-    if (fStringScanner.affectsBehavior(event))
-      fStringScanner.adaptToPreferenceChange(event);
+    if (fStringDQScanner.affectsBehavior(event))
+      fStringDQScanner.adaptToPreferenceChange(event);
+    if (fStringSQScanner.affectsBehavior(event))
+      fStringSQScanner.adaptToPreferenceChange(event);
     if (fJavaDocScanner.affectsBehavior(event))
       fJavaDocScanner.adaptToPreferenceChange(event);
   }
@@ -348,7 +351,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   /**
    * Returns the names of the document position categories used by the document partitioners created by this object to manage their
    * partition information. If the partitioners don't use document position categories, the returned result is <code>null</code>.
-   * 
+   *
    * @return the partition managing position categories or <code>null</code> if there is none
    */
   public String[] getPartitionManagingPositionCategories() {
@@ -377,9 +380,9 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * Returns the preference store used by this configuration to initialize the individual bits and pieces.
-   * 
+   *
    * @return the preference store used to initialize this configuration
-   * 
+   *
    * @since 2.0
    */
   protected IPreferenceStore getPreferenceStore() {
@@ -411,7 +414,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
    * (non-Javadoc) Method declared on SourceViewerConfiguration
    */
   public IAutoIndentStrategy getAutoIndentStrategy(ISourceViewer sourceViewer, String contentType) {
-    if (IPHPPartitions.PHP_PHPDOC_COMMENT.equals(contentType) 
+    if (IPHPPartitions.PHP_PHPDOC_COMMENT.equals(contentType)
         || IPHPPartitions.PHP_MULTILINE_COMMENT.equals(contentType))
       return new JavaDocAutoIndentStrategy(getConfiguredDocumentPartitioning(sourceViewer));
     if (IPHPPartitions.PHP_STRING_DQ.equals(contentType))
@@ -427,7 +430,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * Returns the PHP source code scanner for this configuration.
-   * 
+   *
    * @return the PHP source code scanner
    */
   protected RuleBasedScanner getCodeScanner() {
@@ -436,7 +439,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * Returns the Java multi-line comment scanner for this configuration.
-   * 
+   *
    * @return the Java multi-line comment scanner
    * @since 2.0
    */
@@ -446,7 +449,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * Returns the Java single-line comment scanner for this configuration.
-   * 
+   *
    * @return the Java single-line comment scanner
    * @since 2.0
    */
@@ -455,18 +458,25 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   }
 
   /**
-   * Returns the Java string scanner for this configuration.
-   * 
-   * @return the Java string scanner
-   * @since 2.0
+   * Returns the PHP double quoted string scanner for this configuration.
+   *
+   * @return the PHP double quoted string scanner
    */
-  protected RuleBasedScanner getStringScanner() {
-    return fStringScanner;
+  protected RuleBasedScanner getStringDQScanner() {
+    return fStringDQScanner;
   }
 
   /**
+   * Returns the PHP single quoted string scanner for this configuration.
+   *
+   * @return the PHP single quoted string scanner
+   */
+  protected RuleBasedScanner getStringSQScanner() {
+    return fStringSQScanner;
+  }
+  /**
    * Returns the HTML source code scanner for this configuration.
-   * 
+   *
    * @return the HTML source code scanner
    */
   //  protected RuleBasedScanner getHTMLScanner() {
@@ -474,7 +484,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   //  }
   /**
    * Returns the Smarty source code scanner for this configuration.
-   * 
+   *
    * @return the Smarty source code scanner
    */
   //  protected RuleBasedScanner getSmartyScanner() {
@@ -503,16 +513,6 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
     return null;
   }
 
-  //   public IReconciler getReconciler(ISourceViewer sourceViewer) {
-  //           if (getEditor() != null && getEditor().isEditable()) {
-  //                   JavaReconciler reconciler = new JavaReconciler(getEditor(),
-  //                                   new JavaReconcilingStrategy(getEditor()), false);
-  //                   reconciler.setProgressMonitor(new NullProgressMonitor());
-  //                   reconciler.setDelay(500);
-  //                   return reconciler;
-  //           }
-  //           return null;
-  //   }
   /*
    * @see SourceViewerConfiguration#getConfiguredTextHoverStateMasks(ISourceViewer, String)
    * @since 2.1
@@ -578,7 +578,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * Returns the SmartyDoc source code scanner for this configuration.
-   * 
+   *
    * @return the SmartyDoc source code scanner
    */
   //  protected RuleBasedScanner getSmartyDocScanner() {
@@ -586,7 +586,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   //  }
   /**
    * Returns the PHPDoc source code scanner for this configuration.
-   * 
+   *
    * @return the PHPDoc source code scanner
    */
   protected RuleBasedScanner getPHPDocScanner() {
@@ -601,7 +601,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
     IPHPPartitions.HTML, IPHPPartitions.HTML_MULTILINE_COMMENT, IPHPPartitions.PHP_PARTITIONING,
         IPHPPartitions.PHP_SINGLELINE_COMMENT, IPHPPartitions.PHP_MULTILINE_COMMENT, IPHPPartitions.PHP_PHPDOC_COMMENT,
-        IPHPPartitions.PHP_STRING_DQ, IPHPPartitions.PHP_STRING_SQ, IPHPPartitions.CSS, IPHPPartitions.CSS_MULTILINE_COMMENT,
+        IPHPPartitions.PHP_STRING_DQ, IPHPPartitions.PHP_STRING_SQ, IPHPPartitions.PHP_STRING_HEREDOC, IPHPPartitions.CSS, IPHPPartitions.CSS_MULTILINE_COMMENT,
         IPHPPartitions.JAVASCRIPT, IPHPPartitions.JS_MULTILINE_COMMENT, IPHPPartitions.SMARTY,
         IPHPPartitions.SMARTY_MULTILINE_COMMENT,
 
@@ -625,7 +625,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   public String[] getConfiguredPHPContentTypes() {
     return new String[] { IDocument.DEFAULT_CONTENT_TYPE, IPHPPartitions.PHP_PARTITIONING, IPHPPartitions.PHP_SINGLELINE_COMMENT,
         IPHPPartitions.PHP_MULTILINE_COMMENT, IPHPPartitions.PHP_PHPDOC_COMMENT, IPHPPartitions.PHP_STRING_DQ,
-        IPHPPartitions.PHP_STRING_SQ, IPHPPartitions.CSS, IPHPPartitions.CSS_MULTILINE_COMMENT, IPHPPartitions.JAVASCRIPT,
+        IPHPPartitions.PHP_STRING_SQ, IPHPPartitions.PHP_STRING_HEREDOC, IPHPPartitions.CSS, IPHPPartitions.CSS_MULTILINE_COMMENT, IPHPPartitions.JAVASCRIPT,
         IPHPPartitions.JS_MULTILINE_COMMENT, IPHPPartitions.SMARTY, IPHPPartitions.SMARTY_MULTILINE_COMMENT, };
   }
 
@@ -668,6 +668,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
     assistant.setContentAssistProcessor(processor, IPHPPartitions.PHP_PARTITIONING);
     assistant.setContentAssistProcessor(processor, IPHPPartitions.PHP_STRING_DQ);
     assistant.setContentAssistProcessor(processor, IPHPPartitions.PHP_STRING_SQ);
+    assistant.setContentAssistProcessor(processor, IPHPPartitions.PHP_STRING_HEREDOC);
 
     assistant.setContentAssistProcessor(new PHPDocCompletionProcessor(getEditor()), IPHPPartitions.PHP_PHPDOC_COMMENT);
     //    assistant.enableAutoActivation(true);
@@ -740,28 +741,28 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * @return <code>true</code> iff the new setup without text tools is in use.
-   * 
+   *
    * @since 3.0
    */
-  private boolean isNewSetup() {
-    return fJavaTextTools == null;
-  }
+//  private boolean isNewSetup() {
+//    return fJavaTextTools == null;
+//  }
 
   /**
    * Creates and returns a preference store which combines the preference stores from the text tools and which is read-only.
-   * 
+   *
    * @return the read-only preference store
    * @since 3.0
    */
-  private IPreferenceStore createPreferenceStore() {
-    Assert.isTrue(!isNewSetup());
-    IPreferenceStore generalTextStore = EditorsUI.getPreferenceStore();
-    if (fJavaTextTools.getCorePreferenceStore() == null)
-      return new ChainedPreferenceStore(new IPreferenceStore[] { fJavaTextTools.getPreferenceStore(), generalTextStore });
-
-    return new ChainedPreferenceStore(new IPreferenceStore[] { fJavaTextTools.getPreferenceStore(),
-        new PreferencesAdapter(fJavaTextTools.getCorePreferenceStore()), generalTextStore });
-  }
+//  private IPreferenceStore createPreferenceStore() {
+//    Assert.isTrue(!isNewSetup());
+//    IPreferenceStore generalTextStore = EditorsUI.getPreferenceStore();
+//    if (fJavaTextTools.getCorePreferenceStore() == null)
+//      return new ChainedPreferenceStore(new IPreferenceStore[] { fJavaTextTools.getPreferenceStore(), generalTextStore });
+//
+//    return new ChainedPreferenceStore(new IPreferenceStore[] { fJavaTextTools.getPreferenceStore(),
+//        new PreferencesAdapter(fJavaTextTools.getCorePreferenceStore()), generalTextStore });
+//  }
 
   /*
    * (non-Javadoc) Method declared on SourceViewerConfiguration
@@ -815,12 +816,15 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
     phpReconciler.setDamager(phpDR, IPHPPartitions.PHP_PHPDOC_COMMENT);
     phpReconciler.setRepairer(phpDR, IPHPPartitions.PHP_PHPDOC_COMMENT);
 
-    phpDR = new DefaultDamagerRepairer(getStringScanner());
+    phpDR = new DefaultDamagerRepairer(getStringDQScanner());
     phpReconciler.setDamager(phpDR, IPHPPartitions.PHP_STRING_DQ);
     phpReconciler.setRepairer(phpDR, IPHPPartitions.PHP_STRING_DQ);
-    phpDR = new DefaultDamagerRepairer(getStringScanner());
+    phpDR = new DefaultDamagerRepairer(getStringSQScanner());
     phpReconciler.setDamager(phpDR, IPHPPartitions.PHP_STRING_SQ);
     phpReconciler.setRepairer(phpDR, IPHPPartitions.PHP_STRING_SQ);
+    phpDR = new DefaultDamagerRepairer(getStringDQScanner());
+    phpReconciler.setDamager(phpDR, IPHPPartitions.PHP_STRING_HEREDOC);
+    phpReconciler.setRepairer(phpDR, IPHPPartitions.PHP_STRING_HEREDOC);
     phpDR = new DefaultDamagerRepairer(getSinglelineCommentScanner());
     phpReconciler.setDamager(phpDR, IPHPPartitions.PHP_SINGLELINE_COMMENT);
     phpReconciler.setRepairer(phpDR, IPHPPartitions.PHP_SINGLELINE_COMMENT);
@@ -831,7 +835,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
     PresentationReconciler reconciler = new PresentationReconciler();
     reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
     //
-    JavaTextTools jspTextTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
+//    JavaTextTools jspTextTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
     DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getPHPDocScanner());//jspTextTools.getJSPTextScanner());
     reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
     reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
@@ -941,7 +945,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   /**
    * Returns the information presenter control creator. The creator is a factory creating the presenter controls for the given
    * source viewer. This implementation always returns a creator for <code>DefaultInformationControl</code> instances.
-   * 
+   *
    * @param sourceViewer
    *          the source viewer to be configured by this configuration
    * @return an information control creator
@@ -961,7 +965,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
   /**
    * Returns the outline presenter control creator. The creator is a factory creating outline presenter controls for the given
    * source viewer. This implementation always returns a creator for <code>JavaOutlineInformationControl</code> instances.
-   * 
+   *
    * @param sourceViewer
    *          the source viewer to be configured by this configuration
    * @return an information control creator
@@ -979,7 +983,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
 
   /**
    * Returns the outline presenter which will determine and shown information requested for the current cursor position.
-   * 
+   *
    * @param sourceViewer
    *          the source viewer to be configured by this configuration
    * @param doCodeResolve
@@ -992,6 +996,7 @@ public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
     presenter.setAnchor(InformationPresenter.ANCHOR_GLOBAL);
     IInformationProvider provider = new JavaElementProvider(getEditor(), doCodeResolve);
     presenter.setInformationProvider(provider, IDocument.DEFAULT_CONTENT_TYPE);
+    presenter.setInformationProvider(provider, PHPDocumentPartitioner.PHP_SCRIPT_CODE);
     presenter.setInformationProvider(provider, IPHPPartitions.PHP_PARTITIONING);
     presenter.setInformationProvider(provider, IPHPPartitions.PHP_PHPDOC_COMMENT);
     presenter.setInformationProvider(provider, IPHPPartitions.SMARTY_MULTILINE_COMMENT);