-
Notifications
You must be signed in to change notification settings - Fork 2
/
LanguageVersionDiscoverer.java
145 lines (126 loc) · 4.65 KB
/
LanguageVersionDiscoverer.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import net.sourceforge.pmd.internal.util.AssertionUtil;
/**
* This class can discover the LanguageVersion of a source file. Further, every
* Language has a default LanguageVersion, which can be temporarily overridden
* here.
*/
public class LanguageVersionDiscoverer {
private Map<Language, LanguageVersion> languageToLanguageVersion = new HashMap<>();
private LanguageVersion forcedVersion;
public LanguageVersionDiscoverer() {
this(null);
}
/**
* Build a new instance.
*
* @param forcedVersion If non-null, all files should be assigned this version.
* The methods of this class still work as usual and do not
* care about the forced language version.
*/
public LanguageVersionDiscoverer(LanguageVersion forcedVersion) {
this.forcedVersion = forcedVersion;
}
/**
* Set the given LanguageVersion as the current default for it's Language.
*
* @param languageVersion
* The new default for the Language.
* @return The previous default version for the language.
*/
public LanguageVersion setDefaultLanguageVersion(LanguageVersion languageVersion) {
AssertionUtil.requireParamNotNull("languageVersion", languageVersion);
LanguageVersion currentLanguageVersion = languageToLanguageVersion.put(languageVersion.getLanguage(),
languageVersion);
if (currentLanguageVersion == null) {
currentLanguageVersion = languageVersion.getLanguage().getDefaultVersion();
}
return currentLanguageVersion;
}
/**
* Get the current default LanguageVersion for the given Language.
*
* @param language
* The Language.
* @return The current default version for the language.
*/
public LanguageVersion getDefaultLanguageVersion(Language language) {
Objects.requireNonNull(language);
LanguageVersion languageVersion = languageToLanguageVersion.get(language);
if (languageVersion == null) {
languageVersion = language.getDefaultVersion();
}
return languageVersion;
}
/**
* Get the default LanguageVersion for the first Language of a given source
* file.
*
* @param sourceFile
* The file.
* @return The currently configured LanguageVersion for the source file, or
* <code>null</code> if there are no supported Languages for the
* file.
*/
public LanguageVersion getDefaultLanguageVersionForFile(File sourceFile) {
return getDefaultLanguageVersionForFile(sourceFile.getName());
}
/**
* Get the LanguageVersion for the first Language of a source file with the
* given name.
*
* @param fileName
* The file name.
* @return The currently configured LanguageVersion for the source file or
* <code>null</code> if there are no supported Languages for the
* file.
*/
public LanguageVersion getDefaultLanguageVersionForFile(String fileName) {
List<Language> languages = getLanguagesForFile(fileName);
LanguageVersion languageVersion = null;
if (!languages.isEmpty()) {
languageVersion = getDefaultLanguageVersion(languages.get(0));
}
return languageVersion;
}
public LanguageVersion getForcedVersion() {
return forcedVersion;
}
public void setForcedVersion(LanguageVersion forceLanguageVersion) {
this.forcedVersion = forceLanguageVersion;
}
/**
* Get the Languages of a given source file.
*
* @param sourceFile
* The file.
* @return The Languages for the source file, may be empty.
*/
public List<Language> getLanguagesForFile(File sourceFile) {
return getLanguagesForFile(sourceFile.getName());
}
/**
* Get the Languages of a given source file.
*
* @param fileName
* The file name.
* @return The Languages for the source file, may be empty.
*/
public List<Language> getLanguagesForFile(String fileName) {
String extension = getExtension(fileName);
return LanguageRegistry.findByExtension(extension);
}
// Get the extensions from a file
private String getExtension(String fileName) {
return StringUtils.substringAfterLast(fileName, ".");
}
}