1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2018 The Dagger Authors. 3*f585d8a3SJacky Wang * 4*f585d8a3SJacky Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5*f585d8a3SJacky Wang * you may not use this file except in compliance with the License. 6*f585d8a3SJacky Wang * You may obtain a copy of the License at 7*f585d8a3SJacky Wang * 8*f585d8a3SJacky Wang * http://www.apache.org/licenses/LICENSE-2.0 9*f585d8a3SJacky Wang * 10*f585d8a3SJacky Wang * Unless required by applicable law or agreed to in writing, software 11*f585d8a3SJacky Wang * distributed under the License is distributed on an "AS IS" BASIS, 12*f585d8a3SJacky Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f585d8a3SJacky Wang * See the License for the specific language governing permissions and 14*f585d8a3SJacky Wang * limitations under the License. 15*f585d8a3SJacky Wang */ 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang package dagger.spi; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static javax.tools.Diagnostic.Kind.ERROR; 20*f585d8a3SJacky Wang 21*f585d8a3SJacky Wang import com.google.auto.service.AutoService; 22*f585d8a3SJacky Wang import com.google.common.collect.ImmutableSet; 23*f585d8a3SJacky Wang import dagger.model.BindingGraph; 24*f585d8a3SJacky Wang import java.io.IOException; 25*f585d8a3SJacky Wang import java.io.UncheckedIOException; 26*f585d8a3SJacky Wang import java.util.Map; 27*f585d8a3SJacky Wang import java.util.Set; 28*f585d8a3SJacky Wang import javax.annotation.processing.Filer; 29*f585d8a3SJacky Wang import javax.tools.StandardLocation; 30*f585d8a3SJacky Wang 31*f585d8a3SJacky Wang @AutoService(BindingGraphPlugin.class) 32*f585d8a3SJacky Wang public final class FailingPlugin implements BindingGraphPlugin { 33*f585d8a3SJacky Wang private Map<String, String> options; 34*f585d8a3SJacky Wang private Filer filer; 35*f585d8a3SJacky Wang 36*f585d8a3SJacky Wang @Override supportedOptions()37*f585d8a3SJacky Wang public Set<String> supportedOptions() { 38*f585d8a3SJacky Wang return ImmutableSet.of( 39*f585d8a3SJacky Wang "error_on_binding", 40*f585d8a3SJacky Wang "error_on_dependency", 41*f585d8a3SJacky Wang "error_on_component", 42*f585d8a3SJacky Wang "error_on_subcomponents"); 43*f585d8a3SJacky Wang } 44*f585d8a3SJacky Wang 45*f585d8a3SJacky Wang @Override initFiler(Filer filer)46*f585d8a3SJacky Wang public void initFiler(Filer filer) { 47*f585d8a3SJacky Wang this.filer = filer; 48*f585d8a3SJacky Wang } 49*f585d8a3SJacky Wang 50*f585d8a3SJacky Wang @Override initOptions(Map<String, String> options)51*f585d8a3SJacky Wang public void initOptions(Map<String, String> options) { 52*f585d8a3SJacky Wang this.options = options; 53*f585d8a3SJacky Wang } 54*f585d8a3SJacky Wang 55*f585d8a3SJacky Wang @Override visitGraph(BindingGraph bindingGraph, DiagnosticReporter diagnosticReporter)56*f585d8a3SJacky Wang public void visitGraph(BindingGraph bindingGraph, DiagnosticReporter diagnosticReporter) { 57*f585d8a3SJacky Wang if (options.containsKey("error_on_binding")) { 58*f585d8a3SJacky Wang String key = options.get("error_on_binding"); 59*f585d8a3SJacky Wang bindingGraph.bindings().stream() 60*f585d8a3SJacky Wang .filter(binding -> binding.key().toString().equals(key)) 61*f585d8a3SJacky Wang .forEach( 62*f585d8a3SJacky Wang binding -> 63*f585d8a3SJacky Wang diagnosticReporter.reportBinding(ERROR, binding, "Bad Binding: %s", binding)); 64*f585d8a3SJacky Wang } 65*f585d8a3SJacky Wang 66*f585d8a3SJacky Wang if (options.containsKey("error_on_component")) { 67*f585d8a3SJacky Wang diagnosticReporter.reportComponent( 68*f585d8a3SJacky Wang ERROR, 69*f585d8a3SJacky Wang bindingGraph.rootComponentNode(), 70*f585d8a3SJacky Wang "Bad Component: %s", 71*f585d8a3SJacky Wang bindingGraph.rootComponentNode()); 72*f585d8a3SJacky Wang } 73*f585d8a3SJacky Wang 74*f585d8a3SJacky Wang if (options.containsKey("error_on_subcomponents")) { 75*f585d8a3SJacky Wang bindingGraph.componentNodes().stream() 76*f585d8a3SJacky Wang .filter(componentNode -> !componentNode.componentPath().atRoot()) 77*f585d8a3SJacky Wang .forEach( 78*f585d8a3SJacky Wang componentNode -> 79*f585d8a3SJacky Wang diagnosticReporter.reportComponent( 80*f585d8a3SJacky Wang ERROR, componentNode, "Bad Subcomponent: %s", componentNode)); 81*f585d8a3SJacky Wang } 82*f585d8a3SJacky Wang 83*f585d8a3SJacky Wang if (options.containsKey("error_on_dependency")) { 84*f585d8a3SJacky Wang String dependency = options.get("error_on_dependency"); 85*f585d8a3SJacky Wang bindingGraph.dependencyEdges().stream() 86*f585d8a3SJacky Wang .filter( 87*f585d8a3SJacky Wang edge -> 88*f585d8a3SJacky Wang edge.dependencyRequest() 89*f585d8a3SJacky Wang .requestElement() 90*f585d8a3SJacky Wang .get() 91*f585d8a3SJacky Wang .getSimpleName() 92*f585d8a3SJacky Wang .contentEquals(dependency)) 93*f585d8a3SJacky Wang .forEach( 94*f585d8a3SJacky Wang edge -> diagnosticReporter.reportDependency(ERROR, edge, "Bad Dependency: %s", edge)); 95*f585d8a3SJacky Wang } 96*f585d8a3SJacky Wang } 97*f585d8a3SJacky Wang 98*f585d8a3SJacky Wang @Override pluginName()99*f585d8a3SJacky Wang public String pluginName() { 100*f585d8a3SJacky Wang return "FailingPlugin"; 101*f585d8a3SJacky Wang } 102*f585d8a3SJacky Wang 103*f585d8a3SJacky Wang @Override onPluginEnd()104*f585d8a3SJacky Wang public void onPluginEnd() { 105*f585d8a3SJacky Wang try { 106*f585d8a3SJacky Wang filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "onPluginEndTest.txt"); 107*f585d8a3SJacky Wang } catch (IOException e) { 108*f585d8a3SJacky Wang throw new UncheckedIOException("Failed to create txt file", e); 109*f585d8a3SJacky Wang } 110*f585d8a3SJacky Wang } 111*f585d8a3SJacky Wang } 112