Skip to content

Commit

Permalink
Error on component methods with type variables.
Browse files Browse the repository at this point in the history
These will always lead to a missing binding error, but the processor sometimes also throws (e.g. in InjectBindingRegistry.getOrFindMembersInjectionBinding, which assumes a valid key for members injection).

RELNOTES=Adds a new error for component methods with type variables

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=175732905
  • Loading branch information
ronshapiro committed Nov 15, 2017
1 parent 8ddc04e commit 71d0ad1
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
4 changes: 4 additions & 0 deletions java/dagger/internal/codegen/ComponentValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,10 @@ public ComponentValidationReport validate(
List<? extends VariableElement> parameters = method.getParameters();
TypeMirror returnType = resolvedMethod.getReturnType();

if (!resolvedMethod.getTypeVariables().isEmpty()) {
builder.addError("Component methods cannot have type variables", method);
}

// abstract methods are ones we have to implement, so they each need to be validated
// first, check the return type. if it's a subcomponent, validate that method as such.
Optional<AnnotationMirror> subcomponentAnnotation =
Expand Down
68 changes: 68 additions & 0 deletions javatests/dagger/internal/codegen/GenericMethodsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Copyright (C) 2017 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;

import static com.google.testing.compile.CompilationSubject.assertThat;
import static dagger.internal.codegen.Compilers.daggerCompiler;

import com.google.testing.compile.Compilation;
import com.google.testing.compile.JavaFileObjects;
import javax.tools.JavaFileObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
public class GenericMethodsTest {
@Test
public void parameterizedComponentMethods() {
JavaFileObject component =
JavaFileObjects.forSourceLines(
"test.TestComponent",
"package test;",
"",
"import dagger.Component;",
"import dagger.MembersInjector;",
"import java.util.Set;",
"",
"@Component",
"interface TestComponent {",
" <T1> void injectTypeVariable(T1 type);",
" <T2> MembersInjector<T2> membersInjector();",
" <T3> Set<T3> setOfT();",
" <UNUSED> TestComponent unused();",
"}");
Compilation compilation = daggerCompiler().compile(component);
assertThat(compilation).failed();
assertThat(compilation)
.hadErrorContaining("cannot have type variables")
.inFile(component)
.onLineContaining("<T1>");
assertThat(compilation)
.hadErrorContaining("cannot have type variables")
.inFile(component)
.onLineContaining("<T2>");
assertThat(compilation)
.hadErrorContaining("cannot have type variables")
.inFile(component)
.onLineContaining("<T3>");
assertThat(compilation)
.hadErrorContaining("cannot have type variables")
.inFile(component)
.onLineContaining("<UNUSED>");
}
}

0 comments on commit 71d0ad1

Please sign in to comment.