From 2d87281d09f9dbc872d4652e578ceaebf483a27e Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Sat, 18 Jun 2016 02:13:58 -0400 Subject: [PATCH] Bug 492006 - Get ATtinyCore building. These boards don't have variants so now handle when they're missing. Includes change to order the properties so that the default menu selections are the same as in the Arduino IDE. Change-Id: Ibcc69e2399a92f513964ef6500c1b1766021cd39 --- .../arduino/core/tests/FullIntegration.java | 196 ++++++++++-------- .../core/internal/HierarchicalProperties.java | 8 +- .../core/internal/LinkedProperties.java | 34 +++ .../core/internal/board/ArduinoBoard.java | 7 + .../core/internal/board/ArduinoPackage.java | 6 +- .../core/internal/board/ArduinoPlatform.java | 11 +- .../build/ArduinoBuildConfiguration.java | 42 ++-- 7 files changed, 189 insertions(+), 115 deletions(-) create mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/LinkedProperties.java diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core.tests/src/org/eclipse/cdt/arduino/core/tests/FullIntegration.java b/toolchains/arduino/org.eclipse.cdt.arduino.core.tests/src/org/eclipse/cdt/arduino/core/tests/FullIntegration.java index 41994a8e053..f3b77afba56 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core.tests/src/org/eclipse/cdt/arduino/core/tests/FullIntegration.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core.tests/src/org/eclipse/cdt/arduino/core/tests/FullIntegration.java @@ -14,10 +14,12 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Set; +import java.util.Map.Entry; import org.eclipse.cdt.arduino.core.internal.Activator; import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences; import org.eclipse.cdt.arduino.core.internal.ArduinoProjectGenerator; +import org.eclipse.cdt.arduino.core.internal.HierarchicalProperties; import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; import org.eclipse.cdt.arduino.core.internal.board.ArduinoManager; import org.eclipse.cdt.arduino.core.internal.board.ArduinoPlatform; @@ -38,108 +40,92 @@ import org.eclipse.remote.core.IRemoteConnection; import org.eclipse.remote.core.IRemoteConnectionType; import org.eclipse.remote.core.IRemoteConnectionWorkingCopy; import org.eclipse.remote.core.IRemoteServicesManager; +import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; @SuppressWarnings("nls") +@RunWith(Parameterized.class) public class FullIntegration { private static final ArduinoManager arduinoManager = Activator.getService(ArduinoManager.class); private static final IRemoteServicesManager remoteManager = Activator.getService(IRemoteServicesManager.class); private static final ICBuildConfigurationManager buildConfigManager = Activator .getService(ICBuildConfigurationManager.class); + private static final IProgressMonitor monitor = new SysoutProgressMonitor(); - private void setBoardUrls() throws Exception { + private static Set skipBuild; + private static Set skipUpload; + private static IProject project; + + private ArduinoBoard board; + + private static void setPreferences() throws Exception { URL[] urls = new URL[] { new URL("http://downloads.arduino.cc/packages/package_index.json"), - new URL("https://adafruit.github.io/arduino-board-index/package_adafruit_index.json") }; + new URL("https://adafruit.github.io/arduino-board-index/package_adafruit_index.json"), + new URL("http://drazzy.com/package_drazzy.com_index.json") }; ArduinoPreferences.setBoardUrlList(urls); - } - private Set getSkipBuild() throws Exception { - Set boards = new HashSet<>(); - - // Fails in arduino too - boards.add(arduinoManager.getBoard("arduino", "avr", "robotControl")); - boards.add(arduinoManager.getBoard("arduino", "avr", "robotMotor")); - boards.add(arduinoManager.getBoard("adafruit", "avr", "adafruit32u4")); - - // What is Microsoft doing? - boards.add(arduinoManager.getBoard("Microsoft", "win10", "w10iotcore")); - - // TODO Need to add support for menu specific build properties - boards.add(arduinoManager.getBoard("arduino", "avr", "mini")); - boards.add(arduinoManager.getBoard("arduino", "avr", "lilypad")); - boards.add(arduinoManager.getBoard("arduino", "avr", "diecimila")); - boards.add(arduinoManager.getBoard("arduino", "avr", "pro")); - boards.add(arduinoManager.getBoard("arduino", "avr", "atmegang")); - boards.add(arduinoManager.getBoard("arduino", "avr", "bt")); - boards.add(arduinoManager.getBoard("arduino", "avr", "mega")); - boards.add(arduinoManager.getBoard("arduino", "avr", "nano")); - boards.add(arduinoManager.getBoard("TeeOnArdu", "avr", "CirPlayTeensyCore")); - boards.add(arduinoManager.getBoard("TeeOnArdu", "avr", "FloraTeensyCore")); - boards.add(arduinoManager.getBoard("TeeOnArdu", "avr", "TeeOnArdu")); - - if (Platform.getOS().equals(Platform.OS_WIN32)) { - // tool chain incorrect? - boards.add(arduinoManager.getBoard("Intel", "i586", "izmir_fd")); - boards.add(arduinoManager.getBoard("Intel", "i586", "izmir_fg")); - boards.add(arduinoManager.getBoard("Intel", "i686", "izmir_ec")); - } - - if (Platform.getOS().equals(Platform.OS_LINUX)) { - // i586/pokysdk missing - boards.add(arduinoManager.getBoard("Intel", "i586", "izmir_fd")); - boards.add(arduinoManager.getBoard("Intel", "i586", "izmir_fg")); - boards.add(arduinoManager.getBoard("Intel", "i686", "izmir_ec")); - } - - return boards; - } - - private Set getSkipUpload() throws Exception { - Set boards = new HashSet<>(); - - // missing upload.protocol - boards.add(arduinoManager.getBoard("arduino", "avr", "gemma")); - boards.add(arduinoManager.getBoard("adafruit", "avr", "gemma")); - boards.add(arduinoManager.getBoard("adafruit", "avr", "trinket5")); - boards.add(arduinoManager.getBoard("adafruit", "avr", "trinket3")); - - // usbtiny missing - boards.add(arduinoManager.getBoard("adafruit", "avr", "protrinket3")); - boards.add(arduinoManager.getBoard("adafruit", "avr", "protrinket5")); - - return boards; - } - - @Test - public void runTest() throws Exception { - IProgressMonitor monitor = new SysoutProgressMonitor(); - - setArduinoHome(); - setBoardUrls(); - loadPlatforms(monitor); - - Set skipBuild = getSkipBuild(); - Set skipUpload = getSkipUpload(); - IProject project = createProject(monitor); - for (ArduinoBoard board : arduinoManager.getInstalledBoards()) { - if (!skipBuild.contains(board)) { - buildBoard(project, board, !skipUpload.contains(board), monitor); - } - } - } - - private void setArduinoHome() throws Exception { Path workspace = Paths.get(ResourcesPlugin.getWorkspace().getRoot().getLocationURI()); ArduinoPreferences.setArduinoHome(workspace.resolve(".arduinocdt")); } - private void loadPlatforms(IProgressMonitor monitor) throws Exception { - Collection plats = arduinoManager.getAvailablePlatforms(monitor); - arduinoManager.installPlatforms(plats, monitor); + private static void setupSkipBuild() throws Exception { + skipBuild = new HashSet<>(); + + // Fails in arduino too + skipBuild.add(arduinoManager.getBoard("arduino", "avr", "robotControl")); + skipBuild.add(arduinoManager.getBoard("arduino", "avr", "robotMotor")); + skipBuild.add(arduinoManager.getBoard("adafruit", "avr", "adafruit32u4")); + + // What is Microsoft doing? + skipBuild.add(arduinoManager.getBoard("Microsoft", "win10", "w10iotcore")); + + if (Platform.getOS().equals(Platform.OS_WIN32)) { + // tool chain incorrect? + skipBuild.add(arduinoManager.getBoard("Intel", "i586", "izmir_fd")); + skipBuild.add(arduinoManager.getBoard("Intel", "i586", "izmir_fg")); + skipBuild.add(arduinoManager.getBoard("Intel", "i686", "izmir_ec")); + } + + if (Platform.getOS().equals(Platform.OS_LINUX)) { + // i586/pokysdk missing + skipBuild.add(arduinoManager.getBoard("Intel", "i586", "izmir_fd")); + skipBuild.add(arduinoManager.getBoard("Intel", "i586", "izmir_fg")); + skipBuild.add(arduinoManager.getBoard("Intel", "i686", "izmir_ec")); + } } - private IProject createProject(IProgressMonitor monitor) throws Exception { + private static void setupSkipUpload() throws Exception { + skipUpload = new HashSet<>(); + + // missing upload.protocol + skipUpload.add(arduinoManager.getBoard("arduino", "avr", "gemma")); + skipUpload.add(arduinoManager.getBoard("adafruit", "avr", "gemma")); + skipUpload.add(arduinoManager.getBoard("adafruit", "avr", "trinket5")); + skipUpload.add(arduinoManager.getBoard("adafruit", "avr", "trinket3")); + skipUpload.add(arduinoManager.getBoard("ATTinyCore", "avr", "attinyx7")); + skipUpload.add(arduinoManager.getBoard("ATTinyCore", "avr", "attinyx61")); + skipUpload.add(arduinoManager.getBoard("ATTinyCore", "avr", "attinyx8")); + skipUpload.add(arduinoManager.getBoard("ATTinyCore", "avr", "attiny1634")); + skipUpload.add(arduinoManager.getBoard("ATTinyCore", "avr", "attinyx313")); + skipUpload.add(arduinoManager.getBoard("ATTinyCore", "avr", "attinyx5")); + skipUpload.add(arduinoManager.getBoard("ATTinyCore", "avr", "attinyx4")); + skipUpload.add(arduinoManager.getBoard("ATTinyCore", "avr", "attinyx41")); + skipUpload.add(arduinoManager.getBoard("ATTinyCore", "avr", "attiny828")); + skipUpload.add(arduinoManager.getBoard("arduino-tiny-841", "avr", "attiny1634")); + skipUpload.add(arduinoManager.getBoard("arduino-tiny-841", "avr", "attinyx41")); + skipUpload.add(arduinoManager.getBoard("arduino-tiny-841", "avr", "attiny828")); + skipUpload.add(arduinoManager.getBoard("arduino-tiny-841", "avr", "attiny828")); + + // usbtiny missing + skipUpload.add(arduinoManager.getBoard("adafruit", "avr", "protrinket3")); + skipUpload.add(arduinoManager.getBoard("adafruit", "avr", "protrinket5")); + } + + private static void createProject() throws Exception { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); String projectName = "ArduinoTest"; ArduinoProjectGenerator generator = new ArduinoProjectGenerator("templates/cppsketch/manifest.xml"); //$NON-NLS-1$ @@ -165,10 +151,36 @@ public class FullIntegration { job.schedule(); job.join(); - return generator.getProject(); + project = generator.getProject(); } - private void buildBoard(IProject project, ArduinoBoard board, boolean upload, IProgressMonitor monitor) throws Exception { + @BeforeClass + public static void setup() throws Exception { + setupSkipBuild(); + setupSkipUpload(); + createProject(); + } + + @Parameters(name = "{0}") + public static Collection getBoards() throws Exception { + setPreferences(); + Collection plats = arduinoManager.getAvailablePlatforms(monitor); + arduinoManager.installPlatforms(plats, monitor); + return arduinoManager.getInstalledBoards(); + } + + public FullIntegration(ArduinoBoard board) { + this.board = board; + } + + @Test + public void runTest() throws Exception { + if (!skipBuild.contains(board)) { + buildBoard(project, board, !skipUpload.contains(board)); + } + } + + private void buildBoard(IProject project, ArduinoBoard board, boolean upload) throws Exception { ArduinoRemoteConnection arduinoTarget = createTarget(board); ArduinoBuildConfigurationProvider provider = (ArduinoBuildConfigurationProvider) buildConfigManager .getProvider(ArduinoBuildConfigurationProvider.ID); @@ -203,6 +215,20 @@ public class FullIntegration { IRemoteConnectionWorkingCopy workingCopy = type.newConnection(board.getName()); ArduinoRemoteConnection.setBoardId(workingCopy, board); ArduinoRemoteConnection.setPortName(workingCopy, "port1"); + + HierarchicalProperties menus = board.getMenus(); + if (menus != null) { + for (Entry menuEntry : menus.getChildren().entrySet()) { + String key = menuEntry.getKey(); + + for (Entry valueEntry : menuEntry.getValue().getChildren().entrySet()) { + String value = valueEntry.getKey(); + ArduinoRemoteConnection.setMenuValue(workingCopy, key, value); + break; + } + } + } + connection = workingCopy.save(); return connection.getService(ArduinoRemoteConnection.class); diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/HierarchicalProperties.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/HierarchicalProperties.java index 382257608db..dea25707f39 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/HierarchicalProperties.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/HierarchicalProperties.java @@ -23,10 +23,10 @@ public class HierarchicalProperties { public HierarchicalProperties() { } - public HierarchicalProperties(Properties properties) { - for (Map.Entry entry : properties.entrySet()) { - String key = (String) entry.getKey(); - String value = (String) entry.getValue(); + public HierarchicalProperties(LinkedProperties properties) { + for (Object keyObj : properties.orderedKeys()) { + String key = (String) keyObj; + String value = (String) properties.get(key); putProperty(key, value); } } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/LinkedProperties.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/LinkedProperties.java new file mode 100644 index 00000000000..8d8853f77a1 --- /dev/null +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/LinkedProperties.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2016 QNX Software Systems 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 + *******************************************************************************/ +package org.eclipse.cdt.arduino.core.internal; + +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Properties; + +public class LinkedProperties extends Properties { + + private static final long serialVersionUID = 1L; + + private final HashSet keys = new LinkedHashSet(); + + public Iterable orderedKeys() { + return Collections.list(keys()); + } + + public Enumeration keys() { + return Collections.enumeration(keys); + } + + public Object put(Object key, Object value) { + keys.add(key); + return super.put(key, value); + } +} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoard.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoard.java index 0bb2b8d667d..bf9e4421410 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoard.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoBoard.java @@ -93,4 +93,11 @@ public class ArduinoBoard { return true; } + @Override + public String toString() { + String arch = getPlatform().getArchitecture(); + String pkg = getPlatform().getPackage().getName(); + return pkg + ',' + arch + ',' + id + ',' + name; + } + } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java index 19a9fffa1b9..b06fe7d7968 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java @@ -17,10 +17,10 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Properties; import org.eclipse.cdt.arduino.core.internal.Activator; import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences; +import org.eclipse.cdt.arduino.core.internal.LinkedProperties; import org.eclipse.core.runtime.CoreException; public class ArduinoPackage { @@ -92,12 +92,12 @@ public class ArduinoPackage { if (Files.isDirectory(getInstallPath())) { Path platformTxt = Paths.get("platform.txt"); //$NON-NLS-1$ try { - Path hardware = getInstallPath().resolve("hardware"); + Path hardware = getInstallPath().resolve("hardware"); //$NON-NLS-1$ if (Files.exists(hardware)) { Files.find(hardware, 2, // $NON-NLS-1$ (path, attrs) -> path.getFileName().equals(platformTxt)).forEach(path -> { try (FileReader reader = new FileReader(path.toFile())) { - Properties platformProperties = new Properties(); + LinkedProperties platformProperties = new LinkedProperties(); platformProperties.load(reader); String arch = path.getName(path.getNameCount() - 2).toString(); String version = platformProperties.getProperty("version"); //$NON-NLS-1$ diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java index 26110ac91c0..306be570c01 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java @@ -29,6 +29,7 @@ import java.util.Properties; import org.eclipse.cdt.arduino.core.internal.Activator; import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences; import org.eclipse.cdt.arduino.core.internal.HierarchicalProperties; +import org.eclipse.cdt.arduino.core.internal.LinkedProperties; import org.eclipse.cdt.arduino.core.internal.Messages; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -54,7 +55,7 @@ public class ArduinoPlatform { private ArduinoPackage pkg; private HierarchicalProperties boardsProperties; - private Properties platformProperties; + private LinkedProperties platformProperties; private Map menus = new HashMap<>(); private Map libraries; @@ -104,13 +105,13 @@ public class ArduinoPlatform { return size; } - public void setPlatformProperties(Properties platformProperties) { + public void setPlatformProperties(LinkedProperties platformProperties) { this.platformProperties = platformProperties; } public List getBoards() { if (boardsProperties == null) { - Properties boardProps = new Properties(); + LinkedProperties boardProps = new LinkedProperties(); if (Files.exists(getInstallPath())) { try (InputStream is = new FileInputStream(getInstallPath().resolve("boards.txt").toFile()); //$NON-NLS-1$ @@ -182,9 +183,9 @@ public class ArduinoPlatform { return null; } - public Properties getPlatformProperties() throws CoreException { + public LinkedProperties getPlatformProperties() throws CoreException { if (platformProperties == null) { - platformProperties = new Properties(); + platformProperties = new LinkedProperties(); try (BufferedReader reader = new BufferedReader( new FileReader(getInstallPath().resolve("platform.txt").toFile()))) { //$NON-NLS-1$ // There are regex's here and need to preserve the \'s diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java index 9f302ea230c..14262d7de68 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java @@ -358,21 +358,23 @@ public class ArduinoBuildConfiguration extends CBuildConfiguration implements Te getSources(coreSources, corePath, true); buildModel.put("platform_core_srcs", coreSources); //$NON-NLS-1$ - ArduinoPlatform variantPlatform = platform; - String variant = properties.getProperty("build.variant"); //$NON-NLS-1$ - if (variant.contains(":")) { //$NON-NLS-1$ - String[] segments = variant.split(":"); //$NON-NLS-1$ - if (segments.length == 2) { - variantPlatform = manager.getInstalledPlatform(segments[0], platform.getArchitecture()); - variant = segments[1]; - } - } - Path variantPath = variantPlatform.getInstallPath().resolve("variants").resolve(variant); //$NON-NLS-1$ - buildModel.put("platform_variant_path", pathString(variantPath)); //$NON-NLS-1$ List variantSources = new ArrayList<>(); - getSources(variantSources, variantPath, true); + String variant = properties.getProperty("build.variant"); //$NON-NLS-1$ + if (variant != null) { + ArduinoPlatform variantPlatform = platform; + if (variant.contains(":")) { //$NON-NLS-1$ + String[] segments = variant.split(":"); //$NON-NLS-1$ + if (segments.length == 2) { + variantPlatform = manager.getInstalledPlatform(segments[0], platform.getArchitecture()); + variant = segments[1]; + } + } + Path variantPath = variantPlatform.getInstallPath().resolve("variants").resolve(variant); //$NON-NLS-1$ + buildModel.put("platform_variant_path", pathString(variantPath)); //$NON-NLS-1$ + getSources(variantSources, variantPath, true); + } buildModel.put("platform_variant_srcs", variantSources); //$NON-NLS-1$ - + properties.put("object_file", "$@"); //$NON-NLS-1$ //$NON-NLS-2$ properties.put("source_file", "$<"); //$NON-NLS-1$ //$NON-NLS-2$ properties.put("archive_file", "core.a"); //$NON-NLS-1$ //$NON-NLS-2$ @@ -608,12 +610,16 @@ public class ArduinoBuildConfiguration extends CBuildConfiguration implements Te ArduinoPlatform variantPlatform = platform; String variant = properties.getProperty("build.variant"); //$NON-NLS-1$ - if (variant.contains(":")) { //$NON-NLS-1$ - String[] segments = variant.split(":"); //$NON-NLS-1$ - if (segments.length == 2) { - variantPlatform = manager.getInstalledPlatform(segments[0], platform.getArchitecture()); - variant = segments[1]; + if (variant != null) { + if (variant.contains(":")) { //$NON-NLS-1$ + String[] segments = variant.split(":"); //$NON-NLS-1$ + if (segments.length == 2) { + variantPlatform = manager.getInstalledPlatform(segments[0], platform.getArchitecture()); + variant = segments[1]; + } } + } else { + return Arrays.asList(corePlatform.getInstallPath().resolve("cores").resolve(core)); //$NON-NLS-1$ } return Arrays.asList(corePlatform.getInstallPath().resolve("cores").resolve(core), //$NON-NLS-1$