1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-02 05:45:58 +02:00

Bug 412247: Makefile Editor: F3 navigation does not work inside conditional directives

This commit is contained in:
Andrew Gvozdev 2013-06-12 22:31:58 -04:00
parent 2e21d2516d
commit e404208cac
3 changed files with 34 additions and 26 deletions

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.make.internal.core.makefile;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.make.core.makefile.IDirective; import org.eclipse.cdt.make.core.makefile.IDirective;
import org.eclipse.cdt.make.core.makefile.IParent; import org.eclipse.cdt.make.core.makefile.IParent;
@ -29,6 +30,17 @@ public abstract class Parent extends Directive implements IParent {
} }
public IDirective[] getDirectives(boolean expand) { public IDirective[] getDirectives(boolean expand) {
if (expand) {
List<IDirective> directives = new ArrayList<IDirective>();
getDirectives(); // populates children for class Include
for (IDirective directive : children) {
directives.add(directive);
if (directive instanceof Parent) {
directives.addAll(Arrays.asList(((Parent) directive).getDirectives(expand)));
}
}
return directives.toArray(new IDirective[directives.size()]);
}
return getDirectives(); return getDirectives();
} }

View file

@ -16,14 +16,12 @@ import java.io.InputStreamReader;
import java.io.Reader; import java.io.Reader;
import java.net.URI; import java.net.URI;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Stack; import java.util.Stack;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.makefile.IDirective; import org.eclipse.cdt.make.core.makefile.IDirective;
import org.eclipse.cdt.make.core.makefile.IMakefile;
import org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider; import org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider;
import org.eclipse.cdt.make.core.makefile.gnu.IGNUMakefile; import org.eclipse.cdt.make.core.makefile.gnu.IGNUMakefile;
import org.eclipse.cdt.make.internal.core.makefile.AbstractMakefile; import org.eclipse.cdt.make.internal.core.makefile.AbstractMakefile;
@ -795,24 +793,6 @@ public class GNUMakefile extends AbstractMakefile implements IGNUMakefile {
return new InferenceRule(this, new Target(tgt)); return new InferenceRule(this, new Target(tgt));
} }
@Override
public IDirective[] getDirectives(boolean expand) {
if (!expand) {
return getDirectives();
}
IDirective[] dirs = getDirectives();
ArrayList<IDirective> list = new ArrayList<IDirective>(Arrays.asList(dirs));
for (IDirective dir : dirs) {
if (dir instanceof Include) {
IDirective[] includedMakefiles = ((Include)dir).getDirectives();
for (IDirective includedMakefile : includedMakefiles) {
list.addAll(Arrays.asList(((IMakefile)includedMakefile).getDirectives()));
}
}
}
return list.toArray(new IDirective[list.size()]);
}
@Override @Override
public IDirective[] getBuiltins() { public IDirective[] getBuiltins() {
return builtins; return builtins;

View file

@ -79,9 +79,12 @@ public class Include extends Parent implements IInclude {
includeFilePath = includeFilePath.setDevice(device); includeFilePath = includeFilePath.setDevice(device);
} }
try { try {
GNUMakefile gnu = new GNUMakefile(); URI includeURI = URIUtil.toURI(includeFilePath);
gnu.parse(URIUtil.toURI(includeFilePath), makefileReaderProvider); if (!isAlreadyIncluded(includeURI)) {
addDirective(gnu); GNUMakefile gnu = new GNUMakefile();
gnu.parse(includeURI, makefileReaderProvider);
addDirective(gnu);
}
continue; continue;
} catch (IOException e) { } catch (IOException e) {
} }
@ -95,10 +98,12 @@ public class Include extends Parent implements IInclude {
// special case: device prefix is seen as relative path by URI // special case: device prefix is seen as relative path by URI
uriPath = '/' + uriPath; uriPath = '/' + uriPath;
} }
GNUMakefile gnu = new GNUMakefile();
URI includeURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uriPath, null, null); URI includeURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uriPath, null, null);
gnu.parse(includeURI, makefileReaderProvider); if (!isAlreadyIncluded(includeURI)) {
addDirective(gnu); GNUMakefile gnu = new GNUMakefile();
gnu.parse(includeURI, makefileReaderProvider);
addDirective(gnu);
}
break; break;
} catch (IOException e) { } catch (IOException e) {
} catch (URISyntaxException exc) { } catch (URISyntaxException exc) {
@ -108,4 +113,15 @@ public class Include extends Parent implements IInclude {
} }
return super.getDirectives(); return super.getDirectives();
} }
private boolean isAlreadyIncluded(URI includeURI) {
for (IDirective parent = getParent(); parent != null; parent = parent.getParent()) {
if (parent instanceof IMakefile) {
if (includeURI.equals(((IMakefile) parent).getFileURI())) {
return true;
}
}
}
return false;
}
} }