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

More work to support gnu makefiles

This commit is contained in:
Alain Magloire 2003-09-21 19:10:19 +00:00
parent 9c0b2ed659
commit e1ef9ffd9f
9 changed files with 167 additions and 78 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

View file

@ -67,6 +67,9 @@ public class MakeUIImages {
public static final String IMG_OBJS_MAKEFILE_COMMAND = NAME_PREFIX + "command_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_MAKEFILE_COMMAND = createManaged(OBJ, IMG_OBJS_MAKEFILE_COMMAND);
public static final String IMG_OBJS_MAKEFILE_INCLUDE = NAME_PREFIX + "include_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_MAKEFILE_INCLUDE = createManaged(OBJ, IMG_OBJS_MAKEFILE_INCLUDE);
public static final String IMG_TOOLS_MAKEFILE_SEGMENT_EDIT= NAME_PREFIX + "segment_edit.gif";
private static ImageDescriptor createManaged(String prefix, String name) {

View file

@ -0,0 +1,24 @@
/**********************************************************************
* Copyright (c) 2002,2003 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.make.internal.ui.editor;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
/**
*/
public interface IMakefileEditorActionDefinitionIds extends ITextEditorActionDefinitionIds {
String UNCOMMENT = "org.eclipse.cdt.make.ui.edit.text.makefile.comment";
String COMMENT = "org.eclipse.cdt.make.ui.edit.text.makefile.uncomment";
}

View file

@ -13,16 +13,19 @@ package org.eclipse.cdt.make.internal.ui.editor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.make.core.makefile.IBadDirective;
import org.eclipse.cdt.make.core.makefile.ICommand;
import org.eclipse.cdt.make.core.makefile.IComment;
import org.eclipse.cdt.make.core.makefile.IDirective;
import org.eclipse.cdt.make.core.makefile.IEmptyLine;
import org.eclipse.cdt.make.core.makefile.IInferenceRule;
import org.eclipse.cdt.make.core.makefile.IMacroDefinition;
import org.eclipse.cdt.make.core.makefile.IMakefile;
import org.eclipse.cdt.make.core.makefile.IParent;
import org.eclipse.cdt.make.core.makefile.IRule;
import org.eclipse.cdt.make.core.makefile.IDirective;
import org.eclipse.cdt.make.core.makefile.ITargetRule;
import org.eclipse.cdt.make.core.makefile.gnu.IInclude;
import org.eclipse.cdt.make.core.makefile.gnu.ITerminal;
import org.eclipse.cdt.make.internal.core.makefile.NullMakefile;
import org.eclipse.cdt.make.internal.ui.MakeUIImages;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
@ -54,6 +57,7 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
protected boolean showMacroDefinition = true;
protected boolean showTargetRule = true;
protected boolean showInferenceRule = true;
protected boolean showIncludeChildren = false;
protected IMakefile makefile;
protected IMakefile nullMakefile = new NullMakefile();
@ -63,8 +67,8 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
*/
public Object[] getChildren(Object element) {
if (element == fInput) {
return getElements(element);
} else if (element instanceof IParent) {
return getElements(makefile);
} else if (element instanceof IDirective) {
return getElements(element);
}
return new Object[0];
@ -74,8 +78,11 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
public Object getParent(Object element) {
if (element instanceof IDirective)
if (element instanceof IMakefile) {
return fInput;
} else if (element instanceof IDirective) {
return ((IDirective)element).getParent();
}
return fInput;
}
@ -86,6 +93,10 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
if (element == fInput) {
return true;
} else if (element instanceof IParent) {
// Do not drill down in includes.
if (element instanceof IInclude && !showIncludeChildren) {
return false;
}
return true;
}
return false;
@ -95,27 +106,30 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
IDirective[] statements;
IDirective[] directives;
if (inputElement == fInput) {
statements = makefile.getStatements();
directives = makefile.getDirectives();
} else if (inputElement instanceof IRule) {
directives = ((IRule)inputElement).getCommands();
} else if (inputElement instanceof IParent) {
statements = ((IParent)inputElement).getStatements();
directives = ((IParent)inputElement).getDirectives();
} else {
statements = new IDirective[0];
directives = new IDirective[0];
}
List list = new ArrayList(statements.length);
for (int i = 0; i < statements.length; i++) {
if (showMacroDefinition && statements[i] instanceof IMacroDefinition) {
list.add(statements[i]);
} else if (showInferenceRule && statements[i] instanceof IInferenceRule) {
list.add(statements[i]);
} else if (showTargetRule && statements[i] instanceof ITargetRule) {
list.add(statements[i]);
List list = new ArrayList(directives.length);
for (int i = 0; i < directives.length; i++) {
if (showMacroDefinition && directives[i] instanceof IMacroDefinition) {
list.add(directives[i]);
} else if (showInferenceRule && directives[i] instanceof IInferenceRule) {
list.add(directives[i]);
} else if (showTargetRule && directives[i] instanceof ITargetRule) {
list.add(directives[i]);
} else {
boolean irrelevant = (statements[i] instanceof IComment ||
statements[i] instanceof IEmptyLine);
boolean irrelevant = (directives[i] instanceof IComment ||
directives[i] instanceof IEmptyLine ||
directives[i] instanceof ITerminal);
if (!irrelevant) {
list.add(statements[i]);
list.add(directives[i]);
}
}
}
@ -142,14 +156,6 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
if (makefile == null) {
makefile = nullMakefile;
}
// IDocument document= fDocumentProvider.getDocument(newInput);
// makefile = fEditor.getMakefile();
// try {
// String content = document.get();
// Reader r = new StringReader(content);
// makefile.parse(r);
// } catch (IOException e) {
// }
}
}
@ -167,10 +173,14 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_INFERENCE_RULE);
} else if (element instanceof IMacroDefinition) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_MACRO);
} else if (element instanceof IParent) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_RELATION);
} else if (element instanceof ICommand) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_COMMAND);
} else if (element instanceof IInclude) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_INCLUDE);
} else if (element instanceof IBadDirective) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_ERROR);
} else if (element instanceof IParent) {
return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_RELATION);
}
return super.getImage(element);
}
@ -189,8 +199,8 @@ public class MakefileContentOutlinePage extends ContentOutlinePage implements IC
}
if (name != null) {
name = name.trim();
if (name.length() > 20) {
name = name.substring(0, 20) + "..."; //$NON-NLS-1$
if (name.length() > 25) {
name = name.substring(0, 25) + " ..."; //$NON-NLS-1$
}
}
return name;

View file

@ -17,6 +17,7 @@ import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.internal.ui.text.MakefileColorManager;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.texteditor.DefaultRangeIndicator;
@ -40,40 +41,6 @@ public class MakefileEditor extends TextEditor {
return page;
}
// public IMakefile getMakefile() {
// IDocument document = getDocumentProvider().getDocument(getEditorInput());
// if (makefile == null) {
// makefile = new GNUMakefile();
// try {
// String content = document.get();
// Reader r = new StringReader(content);
// makefile.parse(r);
// } catch (IOException e) {
// }
// IEditorInput input = getEditorInput();
// if (makefile instanceof GNUMakefile) {
// GNUMakefile gnu = (GNUMakefile)makefile;
// if (input instanceof IFileEditorInput) {
// IFile file = ((IFileEditorInput)input).getFile();
// String[] dirs = gnu.getIncludeDirectories();
// String[] includes = new String[dirs.length + 1];
// System.arraycopy(dirs, 0, includes, 0, dirs.length);
// String cwd = file.getLocation().removeLastSegments(1).toOSString();
// includes[dirs.length] = cwd;
// gnu.setIncludeDirectories(includes);
// }
// }
// } else if (isDirty()) {
// try {
// String content = document.get();
// Reader r = new StringReader(content);
// makefile.parse(r);
// } catch (IOException e) {
// }
// }
// return makefile;
// }
public MakefileEditor() {
super();
initializeEditor();
@ -130,6 +97,16 @@ public class MakefileEditor extends TextEditor {
a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION);
setAction("ContentAssistTip", a); //$NON-NLS-1$
a = new TextOperationAction(bundle, "Comment.", this, ITextOperationTarget.PREFIX); //$NON-NLS-1$
a.setActionDefinitionId(IMakefileEditorActionDefinitionIds.COMMENT);
setAction("Comment", a); //$NON-NLS-1$
markAsStateDependentAction("Comment", true); //$NON-NLS-1$
a = new TextOperationAction(bundle, "Uncomment.", this, ITextOperationTarget.STRIP_PREFIX); //$NON-NLS-1$
a.setActionDefinitionId(IMakefileEditorActionDefinitionIds.UNCOMMENT);
setAction("Uncomment", a); //$NON-NLS-1$
markAsStateDependentAction("Uncomment", true); //$NON-NLS-1$
}
}

View file

@ -58,12 +58,12 @@ public class MakefileSourceConfiguration extends SourceViewerConfiguration {
public String[] getConfiguredContentTypes(ISourceViewer v) {
return new String[] {
IDocument.DEFAULT_CONTENT_TYPE,
MakefilePartitionScanner.MAKEFILE_COMMENT,//MakefileEditor.MAKE_COMMENT,
MakefilePartitionScanner.MAKEFILE_IF_BLOCK,//MakefileEditor.MAKE_KEYWORD,
MakefilePartitionScanner.MAKEFILE_COMMENT,
MakefilePartitionScanner.MAKEFILE_IF_BLOCK,
MakefilePartitionScanner.MAKEFILE_DEF_BLOCK,
MakefilePartitionScanner.MAKEFILE_INCLUDE_BLOCK,
MakefilePartitionScanner.MAKEFILE_MACRO_ASSIGNEMENT, //MakefileEditor.MAKE_MACRO_VAR,
};//MakefileEditor.MAKE_META_DATA };
MakefilePartitionScanner.MAKEFILE_MACRO_ASSIGNEMENT,
};
}

View file

@ -0,0 +1,29 @@
package org.eclipse.cdt.make.internal.ui.text;
/*
* (c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*/
import java.util.Comparator;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
public class CompletionProposalComparator implements Comparator {
/**
* Constructor for CompletionProposalComparator.
*/
public CompletionProposalComparator() {
}
/* (non-Javadoc)
* @see Comparator#compare(Object, Object)
*/
public int compare(Object o1, Object o2) {
ICompletionProposal c1= (ICompletionProposal) o1;
ICompletionProposal c2= (ICompletionProposal) o2;
return c1.getDisplayString().compareToIgnoreCase(c2.getDisplayString());
}
}

View file

@ -59,6 +59,6 @@ public class WordPartDetector {
}
boolean isMakefileLetter(char c) {
return Character.isLetterOrDigit(c) || c == '_';
return Character.isLetterOrDigit(c) || c == '_' || c == '.';
}
}

View file

@ -11,6 +11,8 @@
package org.eclipse.cdt.make.internal.ui.text.makefile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import org.eclipse.cdt.make.core.makefile.IMacroDefinition;
import org.eclipse.cdt.make.core.makefile.IMakefile;
@ -18,6 +20,7 @@ import org.eclipse.cdt.make.core.makefile.IRule;
import org.eclipse.cdt.make.core.makefile.IDirective;
import org.eclipse.cdt.make.internal.ui.MakeUIImages;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.internal.ui.text.CompletionProposalComparator;
import org.eclipse.cdt.make.internal.ui.text.WordPartDetector;
import org.eclipse.cdt.make.ui.IWorkingCopyManager;
import org.eclipse.jface.text.BadLocationException;
@ -69,10 +72,41 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
}
}
public class DirectiveComparator implements Comparator {
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object o1, Object o2) {
String name1;
String name2;
if (o1 instanceof IMacroDefinition) {
name1 = ((IMacroDefinition)o1).getName();
} else if (o1 instanceof IRule) {
name1 = ((IRule)o1).getTarget().toString();
} else {
name1 ="";
}
if (o2 instanceof IMacroDefinition) {
name2 = ((IMacroDefinition)o1).getName();
} else if (o2 instanceof IRule) {
name2 = ((IRule)o1).getTarget().toString();
} else {
name2 ="";
}
//return String.CASE_INSENSITIVE_ORDER.compare(name1, name2);
return name1.compareToIgnoreCase(name2);
}
}
protected IContextInformationValidator fValidator = new Validator();
protected Image imageMacro = MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_MACRO);
protected Image imageTarget = MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_TARGET_RULE);
protected CompletionProposalComparator comparator = new CompletionProposalComparator();
protected IEditorPart fEditor;
protected IWorkingCopyManager fManager;
@ -87,13 +121,13 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
boolean macro = inMacro(viewer, documentOffset);
IMakefile makefile = fManager.getWorkingCopy(fEditor.getEditorInput());
// IMakefile makefile = fEditor.getMakefile();
// String content = viewer.getDocument().get();
// Reader r = new StringReader(content);
// makefile.parse(r);
IDirective[] statements = null;
if (macro) {
statements = makefile.getMacroDefinitions();
IDirective[] m1 = makefile.getMacroDefinitions();
IDirective[] m2 = makefile.getBuiltinMacroDefinitions();
statements = new IDirective[m1.length + m2.length];
System.arraycopy(m1, 0, statements, 0, m1.length);
System.arraycopy(m2, 0, statements, m1.length, m2.length);
} else {
statements = makefile.getTargetRules();
}
@ -131,7 +165,9 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
proposalList.add(result);
}
}
return (ICompletionProposal[]) proposalList.toArray(new ICompletionProposal[0]);
ICompletionProposal[] proposals = (ICompletionProposal[]) proposalList.toArray(new ICompletionProposal[0]);
Arrays.sort(proposals, comparator);
return proposals;
}
/* (non-Javadoc)
@ -141,8 +177,6 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
WordPartDetector wordPart = new WordPartDetector(viewer, documentOffset);
boolean macro = inMacro(viewer, documentOffset);
IMakefile makefile = fManager.getWorkingCopy(fEditor.getEditorInput());
//IMakefile makefile = fEditor.getMakefile(viewer.getDocument());
//IMakefile makefile = fEditor.getMakefile();
ArrayList contextList = new ArrayList();
if (macro) {
IDirective[] statements = makefile.getMacroDefinitions();
@ -157,6 +191,18 @@ public class MakefileCompletionProcessor implements IContentAssistProcessor {
}
}
}
statements = makefile.getBuiltinMacroDefinitions();
for (int i = 0; i < statements.length; i++) {
if (statements[i] instanceof IMacroDefinition) {
String name = ((IMacroDefinition) statements[i]).getName();
if (name != null && name.equals(wordPart.getString())) {
String value = ((IMacroDefinition) statements[i]).getValue().toString();
if (value != null && value.length() > 0) {
contextList.add(value);
}
}
}
}
}
IContextInformation[] result = new IContextInformation[contextList.size()];