| /* ******************************************************************* |
| * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC). |
| * 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: |
| * PARC initial implementation |
| * ******************************************************************/ |
| |
| package org.aspectj.weaver; |
| |
| import java.io.File; |
| import java.util.Arrays; |
| |
| import org.aspectj.bridge.ISourceLocation; |
| import org.aspectj.bridge.SourceLocation; |
| |
| public class SourceContextImpl implements ISourceContext { |
| |
| private int[] lineBreaks; |
| String sourceFilename; |
| |
| public SourceContextImpl(AbstractReferenceTypeDelegate delegate) { |
| sourceFilename = delegate.getSourcefilename(); |
| } |
| |
| public void configureFromAttribute(String name, int[] linebreaks) { |
| this.sourceFilename = name; |
| this.lineBreaks = linebreaks; |
| } |
| |
| public void setSourceFileName(String name) { |
| sourceFilename = name; |
| } |
| |
| private File getSourceFile() { |
| return new File(sourceFilename); |
| } |
| |
| public void tidy() { |
| } |
| |
| public int getOffset() { |
| return 0; |
| } |
| |
| public ISourceLocation makeSourceLocation(IHasPosition position) { |
| if (lineBreaks != null) { |
| int line = Arrays.binarySearch(lineBreaks, position.getStart()); |
| if (line < 0) { |
| line = -line; |
| } |
| return new SourceLocation(getSourceFile(), line); // ??? have more info |
| } else { |
| return new SourceLocation(getSourceFile(), 0); |
| } |
| } |
| |
| public ISourceLocation makeSourceLocation(int line, int offset) { |
| if (line < 0) { |
| line = 0; |
| } |
| SourceLocation sl = new SourceLocation(getSourceFile(), line); |
| if (offset > 0) { |
| sl.setOffset(offset); |
| } else { |
| if (lineBreaks != null) { |
| int likelyOffset = 0; |
| if (line > 0 && line < lineBreaks.length) { |
| // 1st char of given line is next char after previous end of line |
| likelyOffset = lineBreaks[line - 1] + 1; |
| } |
| sl.setOffset(likelyOffset); |
| } |
| } |
| return sl; |
| } |
| |
| public final static ISourceContext UNKNOWN_SOURCE_CONTEXT = new ISourceContext() { |
| public ISourceLocation makeSourceLocation(IHasPosition position) { |
| return null; |
| } |
| |
| public ISourceLocation makeSourceLocation(int line, int offset) { |
| return null; |
| } |
| |
| public int getOffset() { |
| return 0; |
| } |
| |
| public void tidy() { |
| } |
| }; |
| } |