Package org.erlide.backend.debug

Source Code of org.erlide.backend.debug.ErlangLineBreakpoint

/*******************************************************************************
* Copyright (c) 2004 Vlad Dumitrescu and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     Vlad Dumitrescu
*******************************************************************************/
package org.erlide.backend.debug;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.model.LineBreakpoint;
import org.erlide.backend.api.IBackend;
import org.erlide.backend.debug.model.ErlangDebugTarget;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.model.ErlModelException;
import org.erlide.engine.model.erlang.IErlFunctionClause;
import org.erlide.engine.model.erlang.IErlModule;
import org.erlide.engine.model.root.IErlElement;
import org.erlide.util.ErlLogger;

public class ErlangLineBreakpoint extends LineBreakpoint implements IErlangBreakpoint {

    public static final String ERLANG_LINE_BREAKPOINT_MARKER_TYPE = "org.erlide.core.erlang.lineBreakpoint.marker";

    private ErlangDebugTarget target;
    private String clauseHead;
    private int fHitCount;
    private int fBreakAction = BREAK_ACTION_BREAK;

    public ErlangLineBreakpoint() {
        super();
    }

    @Override
    public String getModelIdentifier() {
        return ErlDebugConstants.ID_ERLANG_DEBUG_MODEL;
    }

    public void createMarker(final IResource resource, final int lineNumber)
            throws CoreException {
        final IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
            @Override
            public void run(final IProgressMonitor monitor) throws CoreException {
                final IMarker marker = DebugMarkerUtils.createErlangLineBreakpointMarker(
                        resource, lineNumber, getModelIdentifier());
                setMarker(marker);
                resetClauseHead(lineNumber - 1, resource);
            }
        };
        run(getMarkerRule(resource), runnable);
    }

    protected void resetClauseHead(final int lineNumber, final IResource resource) {
        clauseHead = "";
        if (resource instanceof IFile) {
            final IFile file = (IFile) resource;
            final IErlModule m = ErlangEngine.getInstance().getModel().findModule(file);
            if (m != null) {
                try {
                    m.open(null);
                    final IErlElement e = m.getElementAtLine(lineNumber);
                    if (e instanceof IErlFunctionClause) {
                        final IErlFunctionClause clause = (IErlFunctionClause) e;
                        clauseHead = clause.getName() + clause.getHead();
                    }
                } catch (final ErlModelException e1) {
                    ErlLogger.warn(e1);
                }
            }
        }
    }

    /**
     * Installs this breakpoint
     *
     * @param theTarget
     *            debug target
     */
    public void install(final ErlangDebugTarget theTarget) {
        target = theTarget;
        if (theTarget != null) {
            createRequest(ErlDebugConstants.REQUEST_INSTALL);
        }
    }

    private void createRequest(final int request) {
        final IBackend b = target.getBackend();
        int line = -1;
        try {
            line = getLineNumber();
        } catch (final CoreException e) {
            ErlLogger.warn(e);
        }
        final IResource r = getMarker().getResource();
        final String module = r.getLocation().toPortableString();
        if (line != -1) {
            ErlideDebug.addDeleteLineBreakpoint(b, module, line, request);
        }
    }

    public String getModule() {
        final IResource r = getMarker().getResource();
        return r.getFullPath().removeFileExtension().lastSegment();
    }

    public void remove(final ErlangDebugTarget theTarget) {
        target = theTarget;
        if (theTarget != null) {
            createRequest(ErlDebugConstants.REQUEST_REMOVE);
        }
    }

    public String getClauseHead() {
        if (clauseHead == null) {
            try {
                resetClauseHead(getLineNumber() - 1, getMarker().getResource());
            } catch (final CoreException e) {
            }
        }
        return clauseHead;
    }

    @Override
    public void setMarker(final IMarker marker) throws CoreException {
        super.setMarker(marker);
        clauseHead = null;
    }

    @Override
    public String getCondition() throws CoreException {
        return null;
    }

    @Override
    public boolean isConditionEnabled() throws CoreException {
        return false;
    }

    @Override
    public void setCondition(final String condition) throws CoreException {
    }

    @Override
    public void setConditionEnabled(final boolean enabled) throws CoreException {
    }

    @Override
    public boolean supportsCondition() {
        return false;
    }

    @Override
    public void setHitCount(final int hitCount) {
        fHitCount = hitCount;
    }

    @Override
    public int getHitCount() {
        return fHitCount;
    }

    @Override
    public int getBreakAction() {
        return fBreakAction;
    }

    @Override
    public void setBreakAction(final int traceAction) {
        fBreakAction = traceAction;
    }

    public ErlangDebugTarget getTarget() {
        return target;
    }

    @Override
    public String getMessage() {
        final IMarker marker = getMarker();
        return "Line Breakpoint: " + marker.getResource().getName() + " [line: "
                + marker.getAttribute(IMarker.LINE_NUMBER, -1) + "]";
    }

}
TOP

Related Classes of org.erlide.backend.debug.ErlangLineBreakpoint

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.