142 lines
4.6 KiB
Java
142 lines
4.6 KiB
Java
/*
|
|
* Copyright (C) 2021 The Dagger Authors.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package dagger.internal.codegen.javac;
|
|
|
|
import com.google.common.collect.ImmutableMap;
|
|
import java.util.Locale;
|
|
import javax.annotation.processing.Filer;
|
|
import javax.annotation.processing.Messager;
|
|
import javax.annotation.processing.ProcessingEnvironment;
|
|
import javax.lang.model.SourceVersion;
|
|
import javax.lang.model.element.AnnotationMirror;
|
|
import javax.lang.model.element.AnnotationValue;
|
|
import javax.lang.model.element.Element;
|
|
import javax.lang.model.util.Elements; // ALLOW_TYPES_ELEMENTS since in interface API
|
|
import javax.lang.model.util.Types; // ALLOW_TYPES_ELEMENTS since in interface API
|
|
import javax.tools.Diagnostic;
|
|
import javax.tools.FileObject;
|
|
import javax.tools.JavaFileManager.Location;
|
|
import javax.tools.JavaFileObject;
|
|
|
|
/**
|
|
* An implementation of {@link ProcessingEnvironment} that runs in a javac plugin environment.
|
|
*
|
|
* <p>This environment runs after the classes are already compiled, so parts of the {@link
|
|
* ProcessingEnvironment} API like {@link Filer}, {@link Messager} don't make sense in this
|
|
* environment, so they've been replaced with throwing and no-op implementations respectively.
|
|
*/
|
|
final class JavacPluginProcessingEnvironment implements ProcessingEnvironment {
|
|
private final Elements elements;
|
|
private final Types types;
|
|
private final Filer filer = new ThrowingFiler();
|
|
private final Messager messager = new NoopMessager();
|
|
|
|
JavacPluginProcessingEnvironment(Elements elements, Types types) {
|
|
this.elements = elements;
|
|
this.types = types;
|
|
}
|
|
|
|
@Override
|
|
public Elements getElementUtils() {
|
|
return elements;
|
|
}
|
|
|
|
@Override
|
|
public Types getTypeUtils() {
|
|
return types;
|
|
}
|
|
|
|
@Override
|
|
public Filer getFiler() {
|
|
return filer;
|
|
}
|
|
|
|
@Override
|
|
public Locale getLocale() {
|
|
// Null means there's no locale in effect
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public Messager getMessager() {
|
|
return messager;
|
|
}
|
|
|
|
@Override
|
|
public ImmutableMap<String, String> getOptions() {
|
|
// TODO(erichang): You can technically parse options out of the context, but it is internal
|
|
// implementation and unclear that any of the tools will ever be passing an option.
|
|
return ImmutableMap.of();
|
|
}
|
|
|
|
@Override
|
|
public SourceVersion getSourceVersion() {
|
|
// This source version doesn't really matter because it is saying what version generated code
|
|
// should adhere to, which there shouldn't be any because the Filer doesn't work.
|
|
return SourceVersion.latestSupported();
|
|
}
|
|
|
|
private static final class ThrowingFiler implements Filer {
|
|
@Override
|
|
public JavaFileObject createClassFile(CharSequence name, Element... originatingElements) {
|
|
throw new UnsupportedOperationException("Cannot use a Filer in this context");
|
|
}
|
|
|
|
@Override
|
|
public FileObject createResource(
|
|
Location location,
|
|
CharSequence pkg,
|
|
CharSequence relativeName,
|
|
Element... originatingElements) {
|
|
throw new UnsupportedOperationException("Cannot use a Filer in this context");
|
|
}
|
|
|
|
@Override
|
|
public JavaFileObject createSourceFile(CharSequence name, Element... originatingElements) {
|
|
throw new UnsupportedOperationException("Cannot use a Filer in this context");
|
|
}
|
|
|
|
@Override
|
|
public FileObject getResource(Location location, CharSequence pkg, CharSequence relativeName) {
|
|
throw new UnsupportedOperationException("Cannot use a Filer in this context");
|
|
}
|
|
}
|
|
|
|
private static final class NoopMessager implements Messager {
|
|
@Override
|
|
public void printMessage(Diagnostic.Kind kind, CharSequence charSequence) {}
|
|
|
|
@Override
|
|
public void printMessage(Diagnostic.Kind kind, CharSequence charSequence, Element element) {}
|
|
|
|
@Override
|
|
public void printMessage(
|
|
Diagnostic.Kind kind,
|
|
CharSequence charSequence,
|
|
Element element,
|
|
AnnotationMirror annotationMirror) {}
|
|
|
|
@Override
|
|
public void printMessage(
|
|
Diagnostic.Kind kind,
|
|
CharSequence charSequence,
|
|
Element element,
|
|
AnnotationMirror annotationMirror,
|
|
AnnotationValue annotationValue) {}
|
|
}
|
|
}
|