1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-06 15:55:47 +02:00

Bug 174034 - Support open declaration on Macros by adding a link to the PDOMFile as well as offset and length info to the PDOMMacro record. The made a sneaky path to get that information to ASTMacroName to support the open on the macro definition.

This commit is contained in:
Doug Schaefer 2007-04-23 17:37:31 +00:00
parent 0fea8cc237
commit af018d72e9
5 changed files with 119 additions and 17 deletions

View file

@ -11,6 +11,7 @@
package org.eclipse.cdt.core.index;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.parser.IMacro;
/**
@ -28,5 +29,12 @@ import org.eclipse.cdt.core.parser.IMacro;
* @since 4.0
*/
public interface IIndexMacro extends IMacro {
/**
* If available, return the file location for this macro definition
* otherwise return null
* @return
*/
IASTFileLocation getFileLocation();
}

View file

@ -43,6 +43,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree.IASTInclusionNode;
import org.eclipse.cdt.core.index.IIndexMacro;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IMacro;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
@ -813,14 +814,19 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
* @author jcamelon
*/
public class ASTMacroName extends ASTNode implements IASTName {
private final char[] name;
private IMacroBinding binding = null;
private final char[] name;
private final IASTFileLocation fileLocation;
private IMacroBinding binding = null;
public ASTMacroName(char[] n) {
this.name = n;
this(n, null);
}
public ASTMacroName(char [] n, IASTFileLocation fileLocation) {
this.name = n;
this.fileLocation = fileLocation;
}
/*
* (non-Javadoc)
*
@ -901,6 +907,10 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
//do nothing
}
public IASTFileLocation getFileLocation() {
return fileLocation != null ? fileLocation : super.getFileLocation();
}
public ILinkage getLinkage() {
return Linkage.NO_LINKAGE;
}
@ -1464,6 +1474,12 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
return expansion;
}
public IASTFileLocation getFileLocation() {
return macro != null && macro instanceof IIndexMacro
? ((IIndexMacro)macro).getFileLocation()
: null;
}
public IMacroBinding getBinding() {
return bind;
}
@ -1683,7 +1699,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
r = new ASTObjectMacro();
}
IASTName name = new ASTMacroName(d.name);
IASTName name = new ASTMacroName(d.name, d.getFileLocation());
name.setPropertyInParent(IASTPreprocessorMacroDefinition.MACRO_NAME);
name.setParent(r);
((ASTNode) name).setOffsetAndLength(d.nameOffset, d.name.length);

View file

@ -75,7 +75,7 @@ import org.eclipse.core.runtime.Status;
public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
protected Database db;
public static final int VERSION = 30;
public static final int VERSION = 31;
// 0 - the beginning of it all
// 1 - first change to kick off upgrades
// 2 - added file inclusions
@ -107,6 +107,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
// 28 - templates: class instance/specialization base classes
// 29 - includes: fixed modelling of unresolved includes (180159)
// 30 - templates: method/constructor templates, typedef specializations
// 31 - macros: added file locations
public static final int LINKAGES = Database.DATA_AREA;
public static final int FILE_INDEX = Database.DATA_AREA + 4;

View file

@ -176,7 +176,7 @@ public class PDOMFile implements IIndexFragmentFile {
PDOMMacro lastMacro= null;
for (int i = 0; i < macros.length; i++) {
IASTPreprocessorMacroDefinition macro = macros[i];
PDOMMacro pdomMacro = new PDOMMacro(pdom, macro);
PDOMMacro pdomMacro = new PDOMMacro(pdom, macro, this);
if (lastMacro == null) {
setFirstMacro(pdomMacro);
}

View file

@ -12,13 +12,17 @@
package org.eclipse.cdt.internal.core.pdom.dom;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroParameter;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorFunctionStyleMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexMacro;
import org.eclipse.cdt.core.parser.IMacro;
import org.eclipse.cdt.internal.core.parser.scanner2.FunctionStyleMacro;
@ -33,30 +37,38 @@ import org.eclipse.core.runtime.CoreException;
*
* @author Doug Schaefer
*/
public class PDOMMacro implements IIndexMacro {
public class PDOMMacro implements IIndexMacro, IASTFileLocation {
private final PDOM pdom;
private final int record;
private IMacro macro;
private static final int NAME = 0;
private static final int FIRST_PARAMETER = 4;
private static final int EXPANSION = 8;
private static final int NEXT_MACRO = 12;
private static final int FILE = 4;
private static final int NAME_OFFSET = 8;
private static final int NAME_LENGTH = 12; // short
private static final int FIRST_PARAMETER = 14;
private static final int EXPANSION = 18;
private static final int NEXT_MACRO = 22;
private static final int RECORD_SIZE = 16;
private static final int RECORD_SIZE = 26;
public PDOMMacro(PDOM pdom, int record) {
this.pdom = pdom;
this.record = record;
}
public PDOMMacro(PDOM pdom, IASTPreprocessorMacroDefinition macro) throws CoreException {
public PDOMMacro(PDOM pdom, IASTPreprocessorMacroDefinition macro, PDOMFile file) throws CoreException {
this.pdom = pdom;
Database db = pdom.getDB();
this.record = db.malloc(RECORD_SIZE);
db.putInt(record + NAME, db.newString(macro.getName().toCharArray()).getRecord());
IASTName name = macro.getName();
db.putInt(record + NAME, db.newString(name.toCharArray()).getRecord());
db.putInt(record + FILE, file.getRecord());
IASTFileLocation fileloc = name.getFileLocation();
db.putInt(record + NAME_OFFSET, fileloc.getNodeOffset());
db.putShort(record + NAME_LENGTH, (short) fileloc.getNodeLength());
db.putInt(record + EXPANSION, db.newString(macro.getExpansion()).getRecord());
setNextMacro(0);
@ -118,22 +130,28 @@ public class PDOMMacro implements IIndexMacro {
return rec != 0 ? new PDOMMacroParameter(pdom, rec) : null;
}
private class ObjectStylePDOMMacro extends ObjectStyleMacro {
private class ObjectStylePDOMMacro extends ObjectStyleMacro implements IIndexMacro {
public ObjectStylePDOMMacro(char[] name) {
super(name, null);
}
public char[] getExpansion() {
return getMacroExpansion();
}
public IASTFileLocation getFileLocation() {
return PDOMMacro.this;
}
}
private class FunctionStylePDOMMacro extends FunctionStyleMacro {
private class FunctionStylePDOMMacro extends FunctionStyleMacro implements IIndexMacro {
public FunctionStylePDOMMacro(char[] name, char[][] arglist) {
super(name, null, arglist);
}
public char[] getExpansion() {
return getMacroExpansion();
}
public IASTFileLocation getFileLocation() {
return PDOMMacro.this;
}
}
private char[] getMacroExpansion() {
@ -194,4 +212,63 @@ public class PDOMMacro implements IIndexMacro {
}
return macro.getName();
}
public IIndexFile getFile() throws CoreException {
int filerec = pdom.getDB().getInt(record + FILE);
return filerec != 0 ? new PDOMFile(pdom, filerec) : null;
}
public int getEndingLineNumber() {
return 0;
}
public String getFileName() {
try {
PDOMFile file = (PDOMFile) getFile();
if(file!=null) {
/*
* We need to spec. what this method can return to know
* how to implement this. Existing implmentations return
* the absolute path, so here we attempt to do the same.
*/
URI uri = file.getLocation().getURI();
if ("file".equals(uri.getScheme())) //$NON-NLS-1$
return uri.getSchemeSpecificPart();
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
}
public int getStartingLineNumber() {
return 0;
}
public IASTFileLocation asFileLocation() {
return this;
}
public IASTFileLocation getFileLocation() {
return this;
}
public int getNodeLength() {
try {
return pdom.getDB().getShort(record + NAME_LENGTH);
} catch (CoreException e) {
CCorePlugin.log(e);
return 0;
}
}
public int getNodeOffset() {
try {
return pdom.getDB().getInt(record + NAME_OFFSET);
} catch (CoreException e) {
CCorePlugin.log(e);
return 0;
}
}
}