From da21b108846414112f482bc83d071fba5b66087a Mon Sep 17 00:00:00 2001 From: Chris Recoskie Date: Wed, 5 Jul 2006 18:06:57 +0000 Subject: [PATCH] fix for 40101 --- .../c/hover/AbstractCEditorTextHover.java | 170 +++++++------ .../internal/ui/editors/DebugTextHover.java | 226 ++++++++++++------ 2 files changed, 255 insertions(+), 141 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/AbstractCEditorTextHover.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/AbstractCEditorTextHover.java index e730a998efc..0f20c690926 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/AbstractCEditorTextHover.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/AbstractCEditorTextHover.java @@ -23,7 +23,9 @@ import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHoverExtension; import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.Region; import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.commands.ICommand; @@ -31,89 +33,110 @@ import org.eclipse.ui.commands.IKeySequenceBinding; import org.eclipse.ui.keys.KeySequence; /** - * AbstractCEditorTextHover - * Abstract class for providing hover information for C elements. + * AbstractCEditorTextHover Abstract class for providing hover information for C + * elements. * */ -public class AbstractCEditorTextHover implements ICEditorTextHover, ITextHoverExtension { +public class AbstractCEditorTextHover implements ICEditorTextHover, + ITextHoverExtension { private IEditorPart fEditor; + private ICommand fCommand; -// { -// ICommandManager commandManager= PlatformUI.getWorkbench().getCommandSupport().getCommandManager(); -// fCommand= commandManager.getCommand(ICEditorActionDefinitionIds.SHOW_JAVADOC); -// if (!fCommand.isDefined()) -// fCommand= null; -// } + + // { + // ICommandManager commandManager= + // PlatformUI.getWorkbench().getCommandSupport().getCommandManager(); + // fCommand= + // commandManager.getCommand(ICEditorActionDefinitionIds.SHOW_JAVADOC); + // if (!fCommand.isDefined()) + // fCommand= null; + // } /* * @see IJavaEditorTextHover#setEditor(IEditorPart) */ public void setEditor(IEditorPart editor) { - fEditor= editor; + fEditor = editor; } protected IEditorPart getEditor() { return fEditor; } - + /* * @see ITextHover#getHoverRegion(ITextViewer, int) */ public IRegion getHoverRegion(ITextViewer textViewer, int offset) { - return CWordFinder.findWord(textViewer.getDocument(), offset); + if (textViewer != null) { + /* + * If the hover offset falls within the selection range return the + * region for the whole selection. + */ + Point selectedRange = textViewer.getSelectedRange(); + if (selectedRange.x >= 0 && selectedRange.y > 0 + && offset >= selectedRange.x + && offset <= selectedRange.x + selectedRange.y) + return new Region(selectedRange.x, selectedRange.y); + else { + return CWordFinder.findWord(textViewer.getDocument(), offset); + } + } + return null; } -// protected ICodeAssist getCodeAssist() { -// if (fEditor != null) { -// IEditorInput input= fEditor.getEditorInput(); -// if (input instanceof IClassFileEditorInput) { -// IClassFileEditorInput cfeInput= (IClassFileEditorInput) input; -// return cfeInput.getClassFile(); -// } -// -// IWorkingCopyManager manager= CUIPlugin.getDefault().getWorkingCopyManager(); -// return manager.getWorkingCopy(input); -// } -// -// return null; -// } - + // protected ICodeAssist getCodeAssist() { + // if (fEditor != null) { + // IEditorInput input= fEditor.getEditorInput(); + // if (input instanceof IClassFileEditorInput) { + // IClassFileEditorInput cfeInput= (IClassFileEditorInput) input; + // return cfeInput.getClassFile(); + // } + // + // IWorkingCopyManager manager= + // CUIPlugin.getDefault().getWorkingCopyManager(); + // return manager.getWorkingCopy(input); + // } + // + // return null; + // } /* * @see ITextHover#getHoverInfo(ITextViewer, IRegion) */ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { - -// ICodeAssist resolve= getCodeAssist(); -// if (resolve != null) { -// try { -// ICElement[] result= null; -// -// synchronized (resolve) { -// result= resolve.codeSelect(hoverRegion.getOffset(), hoverRegion.getLength()); -// } -// -// if (result == null) -// return null; -// -// int nResults= result.length; -// if (nResults == 0) -// return null; -// -// return getHoverInfo(result); -// -// } catch (CModelException x) { -// CUIPlugin.log(x.getStatus()); -// } -// } + + // ICodeAssist resolve= getCodeAssist(); + // if (resolve != null) { + // try { + // ICElement[] result= null; + // + // synchronized (resolve) { + // result= resolve.codeSelect(hoverRegion.getOffset(), + // hoverRegion.getLength()); + // } + // + // if (result == null) + // return null; + // + // int nResults= result.length; + // if (nResults == 0) + // return null; + // + // return getHoverInfo(result); + // + // } catch (CModelException x) { + // CUIPlugin.log(x.getStatus()); + // } + // } return null; } /** * Provides hover information for the given C elements. * - * @param cElements the C elements for which to provide hover information + * @param cElements + * the C elements for which to provide hover information * @return the hover information string */ protected String getHoverInfo(ICElement[] cElements) { @@ -127,33 +150,39 @@ public class AbstractCEditorTextHover implements ICEditorTextHover, ITextHoverEx public IInformationControlCreator getHoverControlCreator() { return new IInformationControlCreator() { public IInformationControl createInformationControl(Shell parent) { - return new DefaultInformationControl(parent, SWT.NONE, new HTMLTextPresenter(true), getTooltipAffordanceString()); + return new DefaultInformationControl(parent, SWT.NONE, + new HTMLTextPresenter(true), + getTooltipAffordanceString()); } }; } - + /** * Returns the tool tip affordance string. * - * @return the affordance string or null if disabled or no key binding is defined + * @return the affordance string or null if disabled or no + * key binding is defined * @since 3.0 */ protected String getTooltipAffordanceString() { -// if (!CUIPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE)) -// return null; -// -// KeySequence[] sequences= getKeySequences(); -// if (sequences == null) -// return null; -// -// String keySequence= sequences[0].format(); -// return CHoverMessages.getFormattedString("JavaTextHover.makeStickyHint", keySequence); //$NON-NLS-1$ + // if + // (!CUIPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE)) + // return null; + // + // KeySequence[] sequences= getKeySequences(); + // if (sequences == null) + // return null; + // + // String keySequence= sequences[0].format(); + // return + // CHoverMessages.getFormattedString("JavaTextHover.makeStickyHint", + // keySequence); //$NON-NLS-1$ return null; } /** - * Returns the array of valid key sequence bindings for the - * show tool tip description command. + * Returns the array of valid key sequence bindings for the show tool tip + * description command. * * @return the array with the {@link KeySequence}s * @@ -161,14 +190,15 @@ public class AbstractCEditorTextHover implements ICEditorTextHover, ITextHoverEx */ private KeySequence[] getKeySequences() { if (fCommand != null) { - List list= fCommand.getKeySequenceBindings(); + List list = fCommand.getKeySequenceBindings(); if (!list.isEmpty()) { - KeySequence[] keySequences= new KeySequence[list.size()]; - for (int i= 0; i < keySequences.length; i++) { - keySequences[i]= ((IKeySequenceBinding) list.get(i)).getKeySequence(); + KeySequence[] keySequences = new KeySequence[list.size()]; + for (int i = 0; i < keySequences.length; i++) { + keySequences[i] = ((IKeySequenceBinding) list.get(i)) + .getKeySequence(); } return keySequences; - } + } } return null; } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DebugTextHover.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DebugTextHover.java index cce06d6a39a..af084bb626a 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DebugTextHover.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DebugTextHover.java @@ -23,18 +23,63 @@ import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHoverExtension; import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; +import java.util.regex.*; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartListener; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; +/* The class LanguageOperators protects some language specific + * operator information used by the DebugTextHover class. + */ + +class LanguageOperators { + public String getAssignmentOperator() { + return "="; + } + + public String getGreaterThanEqualToOperator() { + return ">="; + } + + public String getEqualToOperator() { + return "=="; + } + + public String getNotEqualToOperator() { + return "!="; + } + + public String getLessThenEqualToOperator() { + return "<="; + } + + public String getValueChangeOperatorsRegex() { + return "(\\+\\+)|(\\-\\-)|(\\+\\=)|" + + "(\\-\\=)|(\\*\\=)|(/\\=)|(\\&\\=)" + + "(\\%\\=)|(\\^\\=)|(\\|\\=)|(\\<\\<\\=)|(\\>\\>\\=)"; + } + + public String getEqualToOperatorsRegex() { + return "\\=\\=|\\<\\=|\\>\\=|!\\="; + } + + public String getIdentifierRegex() { + return "[_A-Za-z][_A-Za-z0-9]*"; + } +} + /** * The text hovering support for C/C++ debugger. */ -public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, ISelectionListener, IPartListener { + +public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, + ISelectionListener, IPartListener { static final private int MAX_HOVER_INFO_SIZE = 100; @@ -52,38 +97,75 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I /* * (non-Javadoc) * - * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion) + * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, + * org.eclipse.jface.text.IRegion) */ - public String getHoverInfo( ITextViewer textViewer, IRegion hoverRegion ) { + public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { ICStackFrame frame = getFrame(); - if ( frame != null && frame.canEvaluate() ) { + if (frame != null && frame.canEvaluate()) { try { IDocument document = textViewer.getDocument(); - if ( document == null ) + if (document == null) return null; - String expression = document.get( hoverRegion.getOffset(), hoverRegion.getLength() ); - if ( expression == null ) + String expression = document.get(hoverRegion.getOffset(), + hoverRegion.getLength()); + if (expression == null) return null; expression = expression.trim(); - if ( expression.length() == 0 ) + if (expression.length() == 0) return null; + LanguageOperators operatorsObj = new LanguageOperators(); + + Pattern pattern = Pattern.compile(operatorsObj + .getValueChangeOperatorsRegex()); + Matcher matcher = pattern.matcher(expression); + + boolean match_found = matcher.find(); + // Get matching string + // If the expression has some operators which can change the + // value of a variable, that expresssion should not be + // evaluated. + if (match_found) { + return null; + } else { + pattern = Pattern.compile(operatorsObj + .getEqualToOperatorsRegex()); + String[] tokens = pattern.split(expression); + for (int i = 0; i < tokens.length; i++) { + //If the expression contains assignment operator that + // can change the value of a variable, the expression + // should not be evaluated. + if (tokens[i].indexOf(operatorsObj + .getAssignmentOperator()) != -1) + return null; + } + //Supressing function calls from evaluation. + String functionCallRegex = operatorsObj + .getIdentifierRegex() + + "\\s*\\("; + pattern = Pattern.compile(functionCallRegex); + matcher = pattern.matcher(expression); + match_found = matcher.find(); + if (match_found) { + return null; + } + } StringBuffer buffer = new StringBuffer(); - String result = evaluateExpression( frame, expression ); - if ( result == null ) + String result = evaluateExpression(frame, expression); + if (result == null) return null; try { - if ( result != null ) - appendVariable( buffer, makeHTMLSafe( expression ), makeHTMLSafe( result.trim() ) ); + if (result != null) + appendVariable(buffer, makeHTMLSafe(expression), + makeHTMLSafe(result.trim())); + } catch (DebugException x) { + CDebugUIPlugin.log(x); } - catch( DebugException x ) { - CDebugUIPlugin.log( x ); - } - if ( buffer.length() > 0 ) { + if (buffer.length() > 0) { return buffer.toString(); } - } - catch( BadLocationException x ) { - CDebugUIPlugin.log( x ); + } catch (BadLocationException x) { + CDebugUIPlugin.log(x); } } return null; @@ -94,22 +176,21 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I * * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int) */ - public IRegion getHoverRegion( ITextViewer viewer, int offset ) { + public IRegion getHoverRegion(ITextViewer viewer, int offset) { /* * Point selectedRange = viewer.getSelectedRange(); if ( selectedRange.x >= 0 && selectedRange.y > 0 && offset >= selectedRange.x && offset <= * selectedRange.x + selectedRange.y ) return new Region( selectedRange.x, selectedRange.y ); */ - if ( viewer != null ) - return CDebugUIUtils.findWord( viewer.getDocument(), offset ); + if (viewer != null) + return CDebugUIUtils.findWord(viewer.getDocument(), offset); return null; } - private String evaluateExpression( ICStackFrame frame, String expression ) { + private String evaluateExpression(ICStackFrame frame, String expression) { String result = null; try { - result = frame.evaluateExpressionToString( expression ); - } - catch( DebugException e ) { + result = frame.evaluateExpressionToString(expression); + } catch (DebugException e) { // ignore } return result; @@ -118,14 +199,15 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I /** * Append HTML for the given variable to the given buffer */ - private static void appendVariable( StringBuffer buffer, String expression, String value ) throws DebugException { - if ( value.length() > MAX_HOVER_INFO_SIZE ) - value = value.substring( 0, MAX_HOVER_INFO_SIZE ) + " ..."; //$NON-NLS-1$ - buffer.append( "

" ); //$NON-NLS-1$ - buffer.append( "

" ).append( expression ).append( "
" ); //$NON-NLS-1$ //$NON-NLS-2$ - buffer.append( " = " ); //$NON-NLS-1$ - buffer.append( "
" ).append( value ).append( "
" ); //$NON-NLS-1$ //$NON-NLS-2$ - buffer.append( "

" ); //$NON-NLS-1$ + private static void appendVariable(StringBuffer buffer, String expression, + String value) throws DebugException { + if (value.length() > MAX_HOVER_INFO_SIZE) + value = value.substring(0, MAX_HOVER_INFO_SIZE) + " ..."; //$NON-NLS-1$ + buffer.append("

"); //$NON-NLS-1$ + buffer.append("

").append(expression).append("
"); //$NON-NLS-1$ //$NON-NLS-2$ + buffer.append(" = "); //$NON-NLS-1$ + buffer.append("
").append(value).append("
"); //$NON-NLS-1$ //$NON-NLS-2$ + buffer.append("

"); //$NON-NLS-1$ } /* @@ -133,20 +215,21 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I * * @see org.eclipse.cdt.ui.text.c.hover.ICEditorTextHover#setEditor(org.eclipse.ui.IEditorPart) */ - public void setEditor( IEditorPart editor ) { - if ( editor != null ) { + public void setEditor(IEditorPart editor) { + if (editor != null) { fEditor = editor; final IWorkbenchPage page = editor.getSite().getPage(); - page.addSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this ); - page.addPartListener( this ); + page.addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this); + page.addPartListener(this); // initialize selection Runnable r = new Runnable() { public void run() { - fSelection = page.getSelection( IDebugUIConstants.ID_DEBUG_VIEW ); + fSelection = page + .getSelection(IDebugUIConstants.ID_DEBUG_VIEW); } }; - CDebugUIPlugin.getStandardDisplay().asyncExec( r ); + CDebugUIPlugin.getStandardDisplay().asyncExec(r); } } @@ -155,7 +238,7 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I * * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection) */ - public void selectionChanged( IWorkbenchPart part, ISelection selection ) { + public void selectionChanged(IWorkbenchPart part, ISelection selection) { fSelection = selection; } @@ -164,7 +247,7 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I * * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart) */ - public void partActivated( IWorkbenchPart part ) { + public void partActivated(IWorkbenchPart part) { } /* @@ -172,7 +255,7 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I * * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart) */ - public void partBroughtToTop( IWorkbenchPart part ) { + public void partBroughtToTop(IWorkbenchPart part) { } /* @@ -180,11 +263,11 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I * * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart) */ - public void partClosed( IWorkbenchPart part ) { - if ( part.equals( fEditor ) ) { + public void partClosed(IWorkbenchPart part) { + if (part.equals(fEditor)) { IWorkbenchPage page = fEditor.getSite().getPage(); - page.removeSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this ); - page.removePartListener( this ); + page.removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this); + page.removePartListener(this); fSelection = null; fEditor = null; } @@ -195,7 +278,7 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I * * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart) */ - public void partDeactivated( IWorkbenchPart part ) { + public void partDeactivated(IWorkbenchPart part) { } /* @@ -203,7 +286,7 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I * * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart) */ - public void partOpened( IWorkbenchPart part ) { + public void partOpened(IWorkbenchPart part) { } /** @@ -212,12 +295,13 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I * @return the evaluation stack frame, or null if none */ protected ICStackFrame getFrame() { - if ( fSelection instanceof IStructuredSelection ) { - IStructuredSelection selection = (IStructuredSelection)fSelection; - if ( selection.size() == 1 ) { + if (fSelection instanceof IStructuredSelection) { + IStructuredSelection selection = (IStructuredSelection) fSelection; + if (selection.size() == 1) { Object el = selection.getFirstElement(); - if ( el instanceof IAdaptable ) { - return (ICStackFrame)((IAdaptable)el).getAdapter( ICStackFrame.class ); + if (el instanceof IAdaptable) { + return (ICStackFrame) ((IAdaptable) el) + .getAdapter(ICStackFrame.class); } } } @@ -236,23 +320,23 @@ public class DebugTextHover implements ICEditorTextHover, ITextHoverExtension, I /** * Replace any characters in the given String that would confuse an HTML parser with their escape sequences. */ - private static String makeHTMLSafe( String string ) { - StringBuffer buffer = new StringBuffer( string.length() ); - for( int i = 0; i != string.length(); i++ ) { - char ch = string.charAt( i ); - switch( ch ) { - case '&': - buffer.append( "&" ); //$NON-NLS-1$ - break; - case '<': - buffer.append( "<" ); //$NON-NLS-1$ - break; - case '>': - buffer.append( ">" ); //$NON-NLS-1$ - break; - default: - buffer.append( ch ); - break; + private static String makeHTMLSafe(String string) { + StringBuffer buffer = new StringBuffer(string.length()); + for (int i = 0; i != string.length(); i++) { + char ch = string.charAt(i); + switch (ch) { + case '&': + buffer.append("&"); //$NON-NLS-1$ + break; + case '<': + buffer.append("<"); //$NON-NLS-1$ + break; + case '>': + buffer.append(">"); //$NON-NLS-1$ + break; + default: + buffer.append(ch); + break; } } return buffer.toString();