Моя тайна начинается так. Рассмотрим этот бит кода:
import java.util.Set;
import javax.annotation.processing.*;
import javax.lang.model.element.TypeElement;
@SupportedOptions({
"thing1",
"thing2",
})
public class fc extends AbstractProcessor
{
@Override
public boolean process( Set<? extends TypeElement> anns, RoundEnvironment re)
{
return false;
}
}
Если вы просматриваете большинство лесов (я просто хотел убедиться, что он минимально закончен, и вы можете запустить на нем свой компилятор), вы увидите в середине аннотацию и потребует инициализатор массива String, и после "thing2"
есть запятая. Теперь, если вы такой, который берет Специфика языка Java, чтобы спать с вами ночью, вы помните, что окончательная запятая отлично valid ", может появиться после последнего выражения в инициализаторе массива и игнорируется." Поэтому, если вы попробуете это в своем любимом javac
, вы не будете удивлены тем, что он отлично компилируется.
Итак, вот тайна. Этот пример выше сконденсирован прямо из реального патча, который был запрошен в реальном проекте из-за реальное сообщение о компиляторе "незаконный старт выражения" , который кто-то получил при создании этого проекта, и ушел, когда удалил последнюю запятую.
Так ясно, что этот человек использовал версию javac
с Braindamaged, или имел какой-то другой инструмент для перебора источника whizbang в своей инструментальной цепочке, у которого нет правильной грамматики Java, и хотя он дал в противном случае полную информацию в своем отчете об ошибке, в этом случае единственной информацией, которая действительно имеет значение, был бы компилятор и инструментальная цепочка и какая версия, которую он использовал, и он ничего не дал! Таким образом, не только был ложный патч, сделанный для кода, который ему не нужен, но недостаточно информации для файла отчета об ошибке, куда ему действительно нужно идти, поставщика инструмента, который дает ложные ошибки в действительной Java.
Итак, я как бы краудсорсинг это:)... может кто-нибудь найти компилятор Java или другой связанный с ним инструмент, который не скомпилирует вышеуказанный код успешно, но помещает ошибку, аналогичную тому, что было сообщено в этом примере? Тогда, может быть, мы узнаем, кто был виновником.
Я только частично разозлился, потому что это был мой код, который получил ложное исправление;)... он меня как-то беспокоит, что может быть какой-то инструмент, который еще не был исправлен, и будет путают больше людей о том, что такое Java, а что нет, и приводят к более странным исправлениям, чтобы это нормально.
Спасибо!