forked from phoedos/pmd
[core] Backporting fixes from pmd7
LanguageFactory and LanguageRegistry are more robust in case a single language can't be loaded.
This commit is contained in:
@@ -37,14 +37,21 @@ public final class LanguageFactory {
|
|||||||
// Use current class' classloader instead of the threads context classloader, see https://github.com/pmd/pmd/issues/1788
|
// Use current class' classloader instead of the threads context classloader, see https://github.com/pmd/pmd/issues/1788
|
||||||
ServiceLoader<Language> languageLoader = ServiceLoader.load(Language.class, getClass().getClassLoader());
|
ServiceLoader<Language> languageLoader = ServiceLoader.load(Language.class, getClass().getClassLoader());
|
||||||
Iterator<Language> iterator = languageLoader.iterator();
|
Iterator<Language> iterator = languageLoader.iterator();
|
||||||
while (iterator.hasNext()) {
|
|
||||||
|
while (true) {
|
||||||
|
// this loop is weird, but both hasNext and next may throw ServiceConfigurationError,
|
||||||
|
// it's more robust that way
|
||||||
try {
|
try {
|
||||||
Language language = iterator.next();
|
if (iterator.hasNext()) {
|
||||||
languagesList.add(language);
|
Language language = iterator.next();
|
||||||
} catch (ServiceConfigurationError | UnsupportedClassVersionError e) {
|
languagesList.add(language);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (UnsupportedClassVersionError | ServiceConfigurationError e) {
|
||||||
// Some languages require java8 and are therefore only available
|
// Some languages require java8 and are therefore only available
|
||||||
// if java8 or later is used as runtime.
|
// if java8 or later is used as runtime.
|
||||||
System.err.println("Ignoring language for CPD: " + e.toString());
|
System.err.println("Ignoring language for PMD: " + e.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -31,11 +31,18 @@ public final class LanguageRegistry {
|
|||||||
// Use current class' classloader instead of the threads context classloader, see https://github.com/pmd/pmd/issues/1377
|
// Use current class' classloader instead of the threads context classloader, see https://github.com/pmd/pmd/issues/1377
|
||||||
ServiceLoader<Language> languageLoader = ServiceLoader.load(Language.class, getClass().getClassLoader());
|
ServiceLoader<Language> languageLoader = ServiceLoader.load(Language.class, getClass().getClassLoader());
|
||||||
Iterator<Language> iterator = languageLoader.iterator();
|
Iterator<Language> iterator = languageLoader.iterator();
|
||||||
while (iterator.hasNext()) {
|
|
||||||
|
while (true) {
|
||||||
|
// this loop is weird, but both hasNext and next may throw ServiceConfigurationError,
|
||||||
|
// it's more robust that way
|
||||||
try {
|
try {
|
||||||
Language language = iterator.next();
|
if (iterator.hasNext()) {
|
||||||
languagesList.add(language);
|
Language language = iterator.next();
|
||||||
} catch (ServiceConfigurationError | UnsupportedClassVersionError e) {
|
languagesList.add(language);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (UnsupportedClassVersionError | ServiceConfigurationError e) {
|
||||||
// Some languages require java8 and are therefore only available
|
// Some languages require java8 and are therefore only available
|
||||||
// if java8 or later is used as runtime.
|
// if java8 or later is used as runtime.
|
||||||
System.err.println("Ignoring language for PMD: " + e.toString());
|
System.err.println("Ignoring language for PMD: " + e.toString());
|
||||||
|
Reference in New Issue
Block a user