blob: 3f6a575fbbb570117a56e5f46e1d373ec78ea2fb [file] [log] [blame]
/*
* 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) {}
}
}