/
CompilationDatabaseContributionManager.java
126 lines (112 loc) · 4.71 KB
/
CompilationDatabaseContributionManager.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/********************************************************************************
* Copyright (c) {date} {owner}[ and others]
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
package org.eclipse.cdt.managedbuilder.core.jsoncdb.generator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IToolChain;
import org.eclipse.cdt.managedbuilder.core.jsoncdb.ICompilationDatabaseContributor;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.annotation.NonNull;
public class CompilationDatabaseContributionManager {
private static final String ATTRIB_RUNNER = "runner"; //$NON-NLS-1$
private static final String ATTRIB_TOOLCHAIN_ID = "toolchainID"; //$NON-NLS-1$
private static final String ID_COMPILATIONDATABASE = "compilationDatabase"; //$NON-NLS-1$
private static final String EXTENSION_ID = "compilationDatabaseContributor"; //$NON-NLS-1$
private Map<String, IConfigurationElement> factoryExtensions;
@NonNull
private Map<String, ICompilationDatabaseContributor> loadedInstances;
private static CompilationDatabaseContributionManager instance;
private CompilationDatabaseContributionManager() {
factoryExtensions = new HashMap<>();
loadedInstances = new HashMap<>();
initalise();
}
public static synchronized CompilationDatabaseContributionManager getInstance() {
if (CompilationDatabaseContributionManager.instance == null) {
CompilationDatabaseContributionManager.instance = new CompilationDatabaseContributionManager();
}
return CompilationDatabaseContributionManager.instance;
}
private void initalise() {
Map<String, IConfigurationElement> loadedExtension = new HashMap<>();
IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(
"org.eclipse.cdt.managedbuilder.core", CompilationDatabaseContributionManager.EXTENSION_ID); //$NON-NLS-1$
if (extension != null) {
IExtension[] extensions = extension.getExtensions();
for (IExtension extension2 : extensions) {
IConfigurationElement[] configElements = extension2.getConfigurationElements();
for (IConfigurationElement configElement : configElements) {
if (CompilationDatabaseContributionManager.ID_COMPILATIONDATABASE.equals(configElement.getName())) { // $NON-NLS-1$
String toolchainId = configElement
.getAttribute(CompilationDatabaseContributionManager.ATTRIB_TOOLCHAIN_ID);
String className = configElement
.getAttribute(CompilationDatabaseContributionManager.ATTRIB_RUNNER);
if (toolchainId != null && className != null) {
loadedExtension.put(toolchainId, configElement);
}
}
}
}
}
factoryExtensions = loadedExtension;
}
/**
* Get the Code Assist tool with the specified id
*
* @param id
* @return Tool extension or a list with no element if not found.
* @throws CoreException
*/
@NonNull
public synchronized ICompilationDatabaseContributor getCompilationDatabaseContributor(
@NonNull IConfiguration config) {
IToolChain toolChain = config.getToolChain();
while (toolChain != null) {
String toolchainId = toolChain.getBaseId();
if (loadedInstances.containsKey(toolchainId)) {
ICompilationDatabaseContributor contributor = loadedInstances.get(toolchainId);
Assert.isNotNull(contributor);
return contributor;
} else if (factoryExtensions.containsKey(toolchainId)) {
return createCdbInstance(toolchainId);
} else {
toolChain = toolChain.getSuperClass();
}
}
return x -> new ArrayList<>();
}
@NonNull
private ICompilationDatabaseContributor createCdbInstance(String toolchainId) {
IConfigurationElement ele = factoryExtensions.get(toolchainId);
if (ele != null) {
ICompilationDatabaseContributor loaded = null;
try {
loaded = (ICompilationDatabaseContributor) ele
.createExecutableExtension(CompilationDatabaseContributionManager.ATTRIB_RUNNER);
} catch (CoreException e) {
Platform.getLog(getClass()).log(Status.error("Not able to create instance", e)); //$NON-NLS-1$
}
if (loaded == null) {
loaded = x -> new ArrayList<>();
}
loadedInstances.put(toolchainId, loaded);
return loaded;
}
return x -> new ArrayList<>();
}
}