Skip to content
This repository has been archived by the owner on Apr 3, 2018. It is now read-only.

Commit

Permalink
LANG: Add build options to Build Targets
Browse files Browse the repository at this point in the history
  • Loading branch information
bruno-medeiros committed Jul 22, 2015
1 parent dcffd3b commit 26872a6
Show file tree
Hide file tree
Showing 26 changed files with 408 additions and 186 deletions.
5 changes: 5 additions & 0 deletions documentation/ChangeLog.md
Expand Up @@ -2,6 +2,11 @@


### (NextVersion) ### (NextVersion)
* Fixed: Arguments field in launch configuration is not multi-line. * Fixed: Arguments field in launch configuration is not multi-line.
* Added support for Build Configurations.
* Available build targets are displayed in the Project Explorer.
You can configure which targets are enabled for a workspace build or not. Or run/debug a specific target.
* Default build targets for Go are: `build`, `install`, `test`.
* Project Build Configuration property page update to configure build targets.




### 0.11.2 ### 0.11.2
Expand Down
Expand Up @@ -29,16 +29,17 @@ public class BuildTargetsSerializer_Test extends CommonTest {
public void testname() throws Exception { testname$(); } public void testname() throws Exception { testname$(); }
public void testname$() throws Exception { public void testname$() throws Exception {
testSerialize(new ArrayList2<>()); testSerialize(new ArrayList2<>());
testSerialize(new ArrayList2<>(createBuildTarget(true, null))); testSerialize(new ArrayList2<>(createBuildTarget(true, null, "-opt")));
testSerialize(new ArrayList2<>( testSerialize(new ArrayList2<>(
createBuildTarget(false, null), createBuildTarget(false, null, ""),
createBuildTarget(true, "blah"), createBuildTarget(true, "blah", "-opt"),
createBuildTarget(true, "xxx") createBuildTarget(true, "xxx", null)
)); ));
} }


protected BuildTarget createBuildTarget(boolean enabled, String name) { protected BuildTarget createBuildTarget(boolean enabled, String name, String buildOptions) {
return LangCore.getBuildManager().createBuildTarget(name, BuildTargetsSerializer.DUMMY_BUILD_CONFIG, enabled); return LangCore.getBuildManager()
.createBuildTarget(name, BuildTargetsSerializer.DUMMY_BUILD_CONFIG, enabled, buildOptions);
} }


protected void testSerialize(ArrayList2<BuildTarget> buildTargets) { protected void testSerialize(ArrayList2<BuildTarget> buildTargets) {
Expand Down
Expand Up @@ -13,20 +13,22 @@
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;


import melnorme.lang.ide.core.LangCore; import melnorme.lang.ide.core.LangCore;
import melnorme.lang.ide.core.operations.build.BuildManager;
import melnorme.lang.ide.core.operations.build.BuildTarget; import melnorme.lang.ide.core.operations.build.BuildTarget;
import melnorme.lang.ide.core.project_model.ProjectBuildInfo; import melnorme.lang.ide.core.project_model.ProjectBuildInfo;
import melnorme.lang.tooling.data.AbstractValidator2; import melnorme.lang.tooling.data.AbstractValidator2;
import melnorme.utilbox.core.CommonException; import melnorme.utilbox.core.CommonException;


public class BuildTargetValidator extends AbstractValidator2 { public class BuildTargetValidator extends AbstractValidator2 {


public BuildTarget getBuildTarget_nonNull(IProject project, String buildTargetAttribute) protected final BuildManager buildManager;
throws CommonException {
BuildTarget buildTarget = getBuildTarget(project, buildTargetAttribute); public BuildTargetValidator() {
if(buildTarget == null) { this(LangCore.getBuildManager());
throw error(LaunchMessages.PROCESS_LAUNCH_NoBuildTargetSpecified); }
}
return buildTarget; public BuildTargetValidator(BuildManager buildManager) {
this.buildManager = buildManager;
} }


public BuildTarget getBuildTarget(IProject project, String buildTargetName) public BuildTarget getBuildTarget(IProject project, String buildTargetName)
Expand All @@ -35,7 +37,7 @@ public BuildTarget getBuildTarget(IProject project, String buildTargetName)
return null; return null;
} }


ProjectBuildInfo buildInfo = LangCore.getBuildManager().getBuildInfo_NonNull(project); ProjectBuildInfo buildInfo = buildManager.getValidBuildInfo(project);


BuildTarget buildTarget = buildInfo.getBuildTarget(buildTargetName); BuildTarget buildTarget = buildInfo.getBuildTarget(buildTargetName);
if(buildTarget == null) { if(buildTarget == null) {
Expand All @@ -44,4 +46,13 @@ public BuildTarget getBuildTarget(IProject project, String buildTargetName)
return buildTarget; return buildTarget;
} }


public BuildTarget getBuildTarget_nonNull(IProject project, String buildTargetAttribute)
throws CommonException {
BuildTarget buildTarget = getBuildTarget(project, buildTargetAttribute);
if(buildTarget == null) {
throw error(LaunchMessages.PROCESS_LAUNCH_NoBuildTargetSpecified);
}
return buildTarget;
}

} }
@@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2014, 2014 IBM Corporation and others. * Copyright (c) 2015 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
Expand All @@ -8,25 +8,19 @@
* Contributors: * Contributors:
* Bruno Medeiros - initial API and implementation * Bruno Medeiros - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package melnorme.lang.ide.core.utils.prefs; package melnorme.lang.ide.core.launch;


import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.variables.IStringVariableManager; import org.eclipse.core.variables.IStringVariableManager;
import org.eclipse.core.variables.VariablesPlugin; import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.DebugPlugin;


public class ProgramArgumentsPreference extends StringPreference { public class LaunchUtils {


public ProgramArgumentsPreference(String key, String defaultValue) { public static String[] getParsedArguments(String extraOptionsString) throws CoreException {
super(key, defaultValue);
}

public String[] getParsedArguments(IProject project) throws CoreException {
String extraOptionsString = get(project);
IStringVariableManager varMgr = VariablesPlugin.getDefault().getStringVariableManager(); IStringVariableManager varMgr = VariablesPlugin.getDefault().getStringVariableManager();
extraOptionsString = varMgr.performStringSubstitution(extraOptionsString, true); extraOptionsString = varMgr.performStringSubstitution(extraOptionsString, true);
return DebugPlugin.parseArguments(extraOptionsString); return DebugPlugin.parseArguments(extraOptionsString);
} }


} }
Expand Up @@ -111,10 +111,16 @@ public ProjectBuildInfo getBuildInfo(IProject project) {
return buildModel.getProjectInfo(project); return buildModel.getProjectInfo(project);
} }


public ProjectBuildInfo getBuildInfo_NonNull(IProject project) throws CommonException { public ProjectBuildInfo getValidBuildInfo(IProject project) throws CommonException {
return getValidBuildInfo(project, true);
}

public ProjectBuildInfo getValidBuildInfo(IProject project, boolean requireNonEmtpyTargets)
throws CommonException {
ProjectBuildInfo buildInfo = getBuildInfo(project); ProjectBuildInfo buildInfo = getBuildInfo(project);
if(buildInfo == null) {
throw new CommonException("No project build targets information available."); if(buildInfo == null || (requireNonEmtpyTargets && buildInfo.getBuildTargets().isEmpty())) {
throw new CommonException("No build targets available for project.");
} }
return buildInfo; return buildInfo;
} }
Expand Down Expand Up @@ -165,15 +171,28 @@ protected void addBuildTargetFromConfig(ArrayList2<BuildTarget> buildTargets, Bu
} }


protected void addBuildTargetFromConfig(ArrayList2<BuildTarget> buildTargets, BuildConfiguration buildConfig, protected void addBuildTargetFromConfig(ArrayList2<BuildTarget> buildTargets, BuildConfiguration buildConfig,
ProjectBuildInfo currentBuildInfo, boolean isFirstConfig, String name) { ProjectBuildInfo currentBuildInfo, boolean isFirstConfig, String targetName) {
boolean enabled = getIsEnabled(currentBuildInfo, isFirstConfig, name); BuildTarget oldBuildTarget = currentBuildInfo == null ?
null :
currentBuildInfo.getDefinedBuildTarget(targetName);

boolean enabled;
String buildOptions;

if(oldBuildTarget == null) {
enabled = isFirstConfig;
buildOptions = getDefaultBuildOptions(targetName);
} else {
enabled = oldBuildTarget.isEnabled();
buildOptions = oldBuildTarget.getBuildOptions();
}


buildTargets.add(createBuildTarget(name, buildConfig, enabled)); buildTargets.add(createBuildTarget(targetName, buildConfig, enabled, buildOptions));
} }


protected boolean getIsEnabled(ProjectBuildInfo currentBuildInfo, boolean isFirstConfig, String name) { @SuppressWarnings("unused")
BuildTarget oldBuildTarget = currentBuildInfo == null ? null : currentBuildInfo.getDefinedBuildTarget(name); public String getDefaultBuildOptions(String buildTargetName) {
return oldBuildTarget == null ? isFirstConfig : oldBuildTarget.isEnabled(); return "";
} }


public ProjectBuildInfo setProjectBuildInfo(IProject project, ProjectBuildInfo newProjectBuildInfo) { public ProjectBuildInfo setProjectBuildInfo(IProject project, ProjectBuildInfo newProjectBuildInfo) {
Expand All @@ -197,8 +216,9 @@ public BuildTarget getBuildTargetFor(ProjectBuildInfo projectBuildInfo, String t
return projectBuildInfo.getDefinedBuildTarget(targetName); return projectBuildInfo.getDefinedBuildTarget(targetName);
} }


public BuildTarget createBuildTarget(String targetName, BuildConfiguration buildConfig, boolean enabled) { public BuildTarget createBuildTarget(String targetName, BuildConfiguration buildConfig,
return new BuildTarget(targetName, buildConfig, enabled); boolean enabled, String buildOptions) {
return new BuildTarget(targetName, buildConfig, enabled, buildOptions);
} }


/* ----------------- Build operations ----------------- */ /* ----------------- Build operations ----------------- */
Expand Down
Expand Up @@ -46,7 +46,7 @@ public BuildOperationCreator(IProject project, OperationInfo parentOpInfo, boole
} }


public IBuildTargetOperation newProjectBuildOperation() throws CommonException { public IBuildTargetOperation newProjectBuildOperation() throws CommonException {
ProjectBuildInfo buildInfo = buildMgr.getBuildInfo_NonNull(project); ProjectBuildInfo buildInfo = buildMgr.getValidBuildInfo(project);
return newProjectBuildOperation(buildInfo.getEnabledTargets()); return newProjectBuildOperation(buildInfo.getEnabledTargets());
} }


Expand Down
Expand Up @@ -12,21 +12,23 @@


import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull; import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import static melnorme.utilbox.core.CoreUtil.areEqual; import static melnorme.utilbox.core.CoreUtil.areEqual;
import static melnorme.utilbox.misc.StringUtil.nullAsEmpty;


import melnorme.lang.ide.core.project_model.AbstractBundleInfo.BuildConfiguration; import melnorme.lang.ide.core.project_model.AbstractBundleInfo.BuildConfiguration;
import melnorme.utilbox.misc.HashcodeUtil; import melnorme.utilbox.misc.HashcodeUtil;
import melnorme.utilbox.misc.StringUtil;


public class BuildTarget { public class BuildTarget {


protected final String targetName; protected final String targetName;
protected final BuildConfiguration buildConfig; protected final BuildConfiguration buildConfig;
protected final boolean enabled; protected final boolean enabled;
protected final String buildOptions;


public BuildTarget(String targetName, BuildConfiguration buildConfig, boolean enabled) { public BuildTarget(String targetName, BuildConfiguration buildConfig, boolean enabled, String buildOptions) {
this.targetName = StringUtil.nullAsEmpty(targetName); this.targetName = nullAsEmpty(targetName);
this.buildConfig = assertNotNull(buildConfig); this.buildConfig = assertNotNull(buildConfig);
this.enabled = enabled; this.enabled = enabled;
this.buildOptions = nullAsEmpty(buildOptions);
} }


public String getTargetName() { public String getTargetName() {
Expand All @@ -41,6 +43,10 @@ public boolean isEnabled() {
return enabled; return enabled;
} }


public String getBuildOptions() {
return buildOptions;
}

@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if(this == obj) return true; if(this == obj) return true;
Expand All @@ -49,13 +55,14 @@ public boolean equals(Object obj) {
BuildTarget other = (BuildTarget) obj; BuildTarget other = (BuildTarget) obj;


return return
areEqual(targetName, other.targetName) &&
areEqual(enabled, other.enabled) && areEqual(enabled, other.enabled) &&
areEqual(targetName, other.targetName); areEqual(buildOptions, other.buildOptions);
} }


@Override @Override
public int hashCode() { public int hashCode() {
return HashcodeUtil.combinedHashCode(enabled, targetName); return HashcodeUtil.combinedHashCode(targetName, enabled, buildOptions);
} }


/* ----------------- ----------------- */ /* ----------------- ----------------- */
Expand Down
Expand Up @@ -43,6 +43,7 @@ public class BuildTargetsSerializer {
private static final String TARGET_ElemName = "target"; private static final String TARGET_ElemName = "target";
private static final String PROP_NAME = "name"; private static final String PROP_NAME = "name";
private static final String PROP_ENABLED = "enabled"; private static final String PROP_ENABLED = "enabled";
private static final String PROP_OPTIONS = "options";


protected static final BuildConfiguration DUMMY_BUILD_CONFIG = new BuildConfiguration("", null); protected static final BuildConfiguration DUMMY_BUILD_CONFIG = new BuildConfiguration("", null);


Expand Down Expand Up @@ -92,21 +93,11 @@ protected void writeDocument(Document doc, Iterable<BuildTarget> buildTargets) {
doc.appendChild(buildTargetsElem); doc.appendChild(buildTargetsElem);


for(BuildTarget buildTarget : buildTargets) { for(BuildTarget buildTarget : buildTargets) {
buildTargetsElem.appendChild(createTargetElement(doc, buildTarget)); buildTargetsElem.appendChild(createBuildTargetElement(doc, buildTarget));
} }


} }


protected Element createTargetElement(Document doc, BuildTarget buildTarget) {
Element targetElem = doc.createElement(TARGET_ElemName);
targetElem.setAttribute(PROP_ENABLED, Boolean.toString(buildTarget.isEnabled()));

String targetName = buildTarget.getTargetName();
targetElem.setAttribute(PROP_NAME, targetName);
return targetElem;
}


public ArrayList2<BuildTarget> readProjectBuildInfo(String targetsXml) throws CommonException { public ArrayList2<BuildTarget> readProjectBuildInfo(String targetsXml) throws CommonException {
Document doc; Document doc;
try { try {
Expand All @@ -127,27 +118,38 @@ public ArrayList2<BuildTarget> readProjectBuildInfo(String targetsXml) throws Co
if(targetElem.getNodeType() == Node.TEXT_NODE) { if(targetElem.getNodeType() == Node.TEXT_NODE) {
continue; continue;
} }
buildTargets.add(readTargetElement(targetElem)); buildTargets.add(readBuildTargetElement(targetElem));
} }


return buildTargets; return buildTargets;
} }


protected BuildTarget readTargetElement(Node targetElem) throws CommonException { protected Element createBuildTargetElement(Document doc, BuildTarget buildTarget) {
Element targetElem = doc.createElement(TARGET_ElemName);

targetElem.setAttribute(PROP_NAME, buildTarget.getTargetName());
targetElem.setAttribute(PROP_ENABLED, Boolean.toString(buildTarget.isEnabled()));
targetElem.setAttribute(PROP_OPTIONS, buildTarget.getBuildOptions());

return targetElem;
}

protected BuildTarget readBuildTargetElement(Node targetElem) throws CommonException {
String nodeName = targetElem.getNodeName(); String nodeName = targetElem.getNodeName();
if(nodeName.equals(TARGET_ElemName)) { if(nodeName.equals(TARGET_ElemName)) {
boolean enabled = getBooleanAttribute(targetElem, PROP_ENABLED, false); boolean enabled = getBooleanAttribute(targetElem, PROP_ENABLED, false);
String targetName = getAttribute(targetElem, PROP_NAME, null); String targetName = getAttribute(targetElem, PROP_NAME, null);
String buildOptions = getAttribute(targetElem, PROP_OPTIONS, null);


return createBuildTarget(enabled, targetName, targetElem); return createBuildTarget(targetElem, targetName, enabled, buildOptions);
} else { } else {
throw new CommonException("XML element not recognized : " + nodeName); throw new CommonException("XML element not recognized : " + nodeName);
} }
} }


protected BuildTarget createBuildTarget(boolean enabled, String targetName, protected BuildTarget createBuildTarget(@SuppressWarnings("unused") Node targetElem,
@SuppressWarnings("unused") Node targetElem) { String targetName, boolean enabled, String buildOptions) {
return buildManager.createBuildTarget(targetName, DUMMY_BUILD_CONFIG, enabled); return buildManager.createBuildTarget(targetName, DUMMY_BUILD_CONFIG, enabled, buildOptions);
} }


protected String getAttribute(Node targetElem, String keyName, String defaultValue) { protected String getAttribute(Node targetElem, String keyName, String defaultValue) {
Expand Down
Expand Up @@ -82,13 +82,24 @@ public ArrayList2<BuildTarget> getEnabledTargets() {
/* ----------------- ----------------- */ /* ----------------- ----------------- */


public void changeEnable(BuildTarget oldBuildTarget, boolean newEnabledValue) throws StatusException { public void changeEnable(BuildTarget oldBuildTarget, boolean newEnabledValue) throws StatusException {
BuildTarget newBuildTarget = buildManager.createBuildTarget( changeBuildTarget(oldBuildTarget, buildManager.createBuildTarget(
oldBuildTarget.getTargetName(), oldBuildTarget.getBuildConfig(), newEnabledValue); oldBuildTarget.getTargetName(),

oldBuildTarget.getBuildConfig(),
changeBuildTarget(oldBuildTarget, newBuildTarget); newEnabledValue,
oldBuildTarget.getBuildOptions()
));
}

public void changeOptions(BuildTarget oldBuildTarget, String newOptionsValue) throws StatusException {
changeBuildTarget(oldBuildTarget, buildManager.createBuildTarget(
oldBuildTarget.getTargetName(),
oldBuildTarget.getBuildConfig(),
oldBuildTarget.isEnabled(),
newOptionsValue
));
} }


public void changeBuildTarget(BuildTarget oldBuildTarget, BuildTarget newBuildTarget) throws StatusException { protected void changeBuildTarget(BuildTarget oldBuildTarget, BuildTarget newBuildTarget) throws StatusException {
boolean mutated = false; boolean mutated = false;
ArrayList2<BuildTarget> newBuildTargets = new ArrayList2<>(buildTargets.size()); ArrayList2<BuildTarget> newBuildTargets = new ArrayList2<>(buildTargets.size());


Expand Down
Expand Up @@ -12,17 +12,11 @@


import melnorme.lang.ide.core.utils.prefs.BooleanPreference; import melnorme.lang.ide.core.utils.prefs.BooleanPreference;
import melnorme.lang.ide.core.utils.prefs.IntPreference; import melnorme.lang.ide.core.utils.prefs.IntPreference;
import melnorme.lang.ide.core.utils.prefs.ProgramArgumentsPreference;
import melnorme.lang.ide.core.utils.prefs.StringPreference; import melnorme.lang.ide.core.utils.prefs.StringPreference;




public interface GoProjectPrefConstants { public interface GoProjectPrefConstants {


ProgramArgumentsPreference GO_BUILD_OPTIONS = new ProgramArgumentsPreference(
"projectPrefs.build_extra_options",
"install -v -gcflags \"-N -l\" ./...");


BooleanPreference ENABLE_AUTO_UNIT_TEST = BooleanPreference ENABLE_AUTO_UNIT_TEST =
new BooleanPreference("projectPrefs.auto_unit_test.enable" , false); new BooleanPreference("projectPrefs.auto_unit_test.enable" , false);
StringPreference AUTO_UNIT_TEST_REGEX = StringPreference AUTO_UNIT_TEST_REGEX =
Expand Down
Expand Up @@ -43,7 +43,9 @@ protected AbstractBundleInfo createNewInfo(IProject project) {
return new AbstractBundleInfo() { return new AbstractBundleInfo() {


protected final ArrayList2<BuildConfiguration> DEFAULT_BUILD_CONFIGs = ArrayList2.create( protected final ArrayList2<BuildConfiguration> DEFAULT_BUILD_CONFIGs = ArrayList2.create(
new BuildConfiguration("./...", null) new BuildConfiguration("#build", null),
new BuildConfiguration("#install", null),
new BuildConfiguration("#test", null)
); );


@Override @Override
Expand Down

0 comments on commit 26872a6

Please sign in to comment.