Search in sources :

Example 1 with IStratumBreakpointSupport

use of org.eclipse.xtext.debug.IStratumBreakpointSupport in project xtext-eclipse by eclipse.

the class StratumBreakpointAdapterFactory method toggleBreakpoints.

@Override
public void toggleBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
    if (!(part instanceof XtextEditor) || !(selection instanceof ITextSelection)) {
        return;
    }
    try {
        final XtextEditor xtextEditor = (XtextEditor) part;
        final IEditorInput editorInput = xtextEditor.getEditorInput();
        final IResource breakpointResource = breakpointUtil.getBreakpointResource(editorInput);
        final SourceRelativeURI breakpointUri = breakpointUtil.getBreakpointURI(editorInput);
        final int offset = ((ITextSelection) selection).getOffset();
        final int line = xtextEditor.getDocument().getLineOfOffset(offset) + 1;
        Data data = xtextEditor.getDocument().readOnly(new IUnitOfWork<Data, XtextResource>() {

            @Override
            public Data exec(XtextResource state) throws Exception {
                IResourceServiceProvider provider = state.getResourceServiceProvider();
                IStratumBreakpointSupport breakpointSupport = provider.get(IStratumBreakpointSupport.class);
                Data result = new Data();
                result.name = state.getURI().lastSegment();
                result.valid = breakpointSupport != null && breakpointSupport.isValidLineForBreakPoint(state, line);
                result.types = getClassNamePattern(state);
                result.lang = provider.get(LanguageInfo.class);
                result.sourceUri = state.getURI();
                if (editorInput.getAdapter(IClassFile.class) != null) {
                    result.classHandle = ((IClassFile) editorInput.getAdapter(IClassFile.class)).getHandleIdentifier();
                }
                return result;
            }
        });
        IJavaStratumLineBreakpoint existingBreakpoint = findExistingBreakpoint(breakpointResource, breakpointUri, line);
        if (existingBreakpoint != null) {
            existingBreakpoint.delete();
            return;
        }
        if (!data.valid || data.types == null)
            return;
        if (log.isDebugEnabled()) {
            log.debug("Types the breakpoint listens for : " + data.types);
        }
        final IRegion information = xtextEditor.getDocument().getLineInformation(line - 1);
        final int charStart = information.getOffset();
        final int charEnd = information.getOffset() + information.getLength();
        final String shortName = data.lang.getShortName();
        Map<String, Object> attributes = Maps.newHashMap();
        if (breakpointUri != null)
            attributes.put(JarFileMarkerAnnotationModel.MARKER_URI, breakpointUri.toString());
        attributes.put(ORG_ECLIPSE_JDT_DEBUG_CORE_SOURCE_NAME, data.name);
        attributes.put(ORG_ECLIPSE_XTEXT_XBASE_SOURCE_URI, data.sourceUri.toString());
        if (data.classHandle != null)
            attributes.put(ORG_ECLIPSE_XTEXT_XBASE_CLASS_HANDLE, data.classHandle);
        final IJavaStratumLineBreakpoint breakpoint = new XbaseLineBreakpoint(breakpointResource, shortName, data.types, line, charStart, charEnd, attributes);
        // make sure the class name pattern gets updated on change
        final IMarker marker = breakpoint.getMarker();
        final IWorkspace ws = marker.getResource().getWorkspace();
        IResourceChangeListener listener = new IResourceChangeListener() {

            @Override
            public void resourceChanged(IResourceChangeEvent event) {
                if (!marker.exists())
                    ws.removeResourceChangeListener(this);
                IResourceDelta delta = event.getDelta();
                if (delta == null)
                    return;
                final IResourceDelta findMember = event.getDelta().findMember(marker.getResource().getFullPath());
                if (findMember == null)
                    return;
                IResource res = findMember.getResource();
                if (res == null || !res.exists())
                    return;
                if (event.getType() == IResourceChangeEvent.PRE_DELETE) {
                    ws.removeResourceChangeListener(this);
                } else if (event.getType() == IResourceChangeEvent.POST_CHANGE && (findMember.getFlags() & IResourceDelta.CONTENT) != 0) {
                    String classNamePattern = getClassNamePattern(event.getResource());
                    try {
                        breakpoint.getMarker().setAttribute("org.eclipse.jdt.debug.pattern", classNamePattern);
                    } catch (CoreException e) {
                        log.info(e.getMessage(), e);
                    }
                }
            }
        };
        ws.addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_DELETE);
    } catch (BadLocationException e) {
        log.info(e.getMessage(), e);
    }
}
Also used : IClassFile(org.eclipse.jdt.core.IClassFile) XtextResource(org.eclipse.xtext.resource.XtextResource) IRegion(org.eclipse.jface.text.IRegion) IJavaStratumLineBreakpoint(org.eclipse.jdt.debug.core.IJavaStratumLineBreakpoint) IResourceServiceProvider(org.eclipse.xtext.resource.IResourceServiceProvider) IResourceChangeEvent(org.eclipse.core.resources.IResourceChangeEvent) IStratumBreakpointSupport(org.eclipse.xtext.debug.IStratumBreakpointSupport) XtextEditor(org.eclipse.xtext.ui.editor.XtextEditor) IResourceChangeListener(org.eclipse.core.resources.IResourceChangeListener) ITextSelection(org.eclipse.jface.text.ITextSelection) IJavaStratumLineBreakpoint(org.eclipse.jdt.debug.core.IJavaStratumLineBreakpoint) IBreakpoint(org.eclipse.debug.core.model.IBreakpoint) CoreException(org.eclipse.core.runtime.CoreException) BadLocationException(org.eclipse.jface.text.BadLocationException) CoreException(org.eclipse.core.runtime.CoreException) IWorkspace(org.eclipse.core.resources.IWorkspace) IMarker(org.eclipse.core.resources.IMarker) SourceRelativeURI(org.eclipse.xtext.generator.trace.SourceRelativeURI) IEditorInput(org.eclipse.ui.IEditorInput) IResource(org.eclipse.core.resources.IResource) BadLocationException(org.eclipse.jface.text.BadLocationException) IResourceDelta(org.eclipse.core.resources.IResourceDelta)

Aggregations

IMarker (org.eclipse.core.resources.IMarker)1 IResource (org.eclipse.core.resources.IResource)1 IResourceChangeEvent (org.eclipse.core.resources.IResourceChangeEvent)1 IResourceChangeListener (org.eclipse.core.resources.IResourceChangeListener)1 IResourceDelta (org.eclipse.core.resources.IResourceDelta)1 IWorkspace (org.eclipse.core.resources.IWorkspace)1 CoreException (org.eclipse.core.runtime.CoreException)1 IBreakpoint (org.eclipse.debug.core.model.IBreakpoint)1 IClassFile (org.eclipse.jdt.core.IClassFile)1 IJavaStratumLineBreakpoint (org.eclipse.jdt.debug.core.IJavaStratumLineBreakpoint)1 BadLocationException (org.eclipse.jface.text.BadLocationException)1 IRegion (org.eclipse.jface.text.IRegion)1 ITextSelection (org.eclipse.jface.text.ITextSelection)1 IEditorInput (org.eclipse.ui.IEditorInput)1 IStratumBreakpointSupport (org.eclipse.xtext.debug.IStratumBreakpointSupport)1 SourceRelativeURI (org.eclipse.xtext.generator.trace.SourceRelativeURI)1 IResourceServiceProvider (org.eclipse.xtext.resource.IResourceServiceProvider)1 XtextResource (org.eclipse.xtext.resource.XtextResource)1 XtextEditor (org.eclipse.xtext.ui.editor.XtextEditor)1