/******************************************************************************* * Copyright (c) 2004, 2010 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.jsdt.internal.core; import org.eclipse.wst.jsdt.core.IBuffer; import org.eclipse.wst.jsdt.core.IJavaScriptUnit; import org.eclipse.wst.jsdt.core.ISourceRange; import org.eclipse.wst.jsdt.core.JavaScriptModelException; import org.eclipse.wst.jsdt.core.ToolFactory; import org.eclipse.wst.jsdt.core.compiler.IScanner; import org.eclipse.wst.jsdt.core.compiler.ITerminalSymbols; import org.eclipse.wst.jsdt.core.compiler.InvalidInputException; /** * Handle representing a source field that is resolved. The uniqueKey contains * the genericSignature of the resolved field. Use BindingKey to decode it. */ public class ResolvedSourceField extends SourceField { private String uniqueKey; /* * See class comments. */ public ResolvedSourceField(JavaElement parent, String name, String uniqueKey) { super(parent, name); this.uniqueKey = uniqueKey; } /* * (non-Javadoc) * * @see org.eclipse.wst.jsdt.internal.core.SourceField#getKey() */ public String getKey() { return this.uniqueKey; } /* * (non-Javadoc) * * @see org.eclipse.wst.jsdt.core.IField#isResolved() */ public boolean isResolved() { return true; } /** * @private Debugging purposes */ protected void toStringInfo(int tab, StringBuffer buffer, Object info, boolean showResolvedInfo) { super.toStringInfo(tab, buffer, info, showResolvedInfo); if (showResolvedInfo) { buffer.append(" {key="); //$NON-NLS-1$ buffer.append(this.uniqueKey); buffer.append("}"); //$NON-NLS-1$ } } public JavaElement unresolved() { SourceRefElement handle = new SourceField(this.parent, this.name); handle.occurrenceCount = this.occurrenceCount; return handle; } // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=278904 public ISourceRange getJSdocRange() throws JavaScriptModelException { ISourceRange defaultRange = super.getJSdocRange(); if (defaultRange != null) return defaultRange; ISourceRange range = this.getSourceRange(); if (range == null) return null; IBuffer buf = null; if (this.isBinary()) { buf = this.getClassFile().getBuffer(); } else { IJavaScriptUnit compilationUnit = this.getJavaScriptUnit(); if (!compilationUnit.isConsistent()) { return null; } buf = compilationUnit.getBuffer(); } final int start = range.getOffset(); final int length = range.getLength(); if (length > 0 && buf.getChar(start) != '/') { IScanner scanner = ToolFactory.createScanner(true, false, false, false); scanner.setSource(buf.getContents().toCharArray()); try { int docOffset = -1; int docEnd = -1; int previousTerminal = -1; int previousOffset = -1; int previousEnd = -1; int terminal = scanner.getNextToken(); loop : while (true) { if (scanner.getCurrentTokenEndPosition() < start) { previousTerminal = terminal; previousOffset = scanner.getCurrentTokenStartPosition(); previousEnd = scanner.getCurrentTokenEndPosition() + 1; terminal = scanner.getNextToken(); continue loop; } switch (previousTerminal) { case ITerminalSymbols.TokenNameCOMMENT_BLOCK : case ITerminalSymbols.TokenNameCOMMENT_JAVADOC : docOffset = previousOffset; docEnd = previousEnd; terminal = scanner.getNextToken(); break loop; default : break loop; } } if (docOffset != -1) { return new SourceRange(docOffset, docEnd - docOffset + 1); } } catch (InvalidInputException ex) { // try if there is inherited Javadoc } } return null; } }