Skip to content

Commit 55c8b43

Browse files
committed
Implement default method for AbstractJctCompiler#getFileManagerFactory
1 parent 4dab42b commit 55c8b43

File tree

2 files changed

+41
-11
lines changed

2 files changed

+41
-11
lines changed

java-compiler-testing/src/main/java/io/github/ascopes/jct/compilers/AbstractJctCompiler.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.github.ascopes.jct.ex.JctCompilerException;
2424
import io.github.ascopes.jct.filemanagers.AnnotationProcessorDiscovery;
2525
import io.github.ascopes.jct.filemanagers.JctFileManagerFactory;
26+
import io.github.ascopes.jct.filemanagers.JctFileManagers;
2627
import io.github.ascopes.jct.filemanagers.LoggingMode;
2728
import io.github.ascopes.jct.workspaces.Workspace;
2829
import java.io.IOException;
@@ -432,9 +433,15 @@ public final String toString() {
432433
/**
433434
* Get the file manager factory to use for building AbstractJctCompiler file manager during compilation.
434435
*
436+
* <p>Since v1.1.0, this method has provided a default implementation. Before this, it was
437+
* abstract. The default implementation calls
438+
* {@link JctFileManagers#newJctFileManagerFactory(JctCompiler)}.
439+
*
435440
* @return the factory.
436441
*/
437-
public abstract JctFileManagerFactory getFileManagerFactory();
442+
public JctFileManagerFactory getFileManagerFactory() {
443+
return JctFileManagers.newJctFileManagerFactory(this);
444+
}
438445

439446
/**
440447
* Get the compilation factory to use for building a compilation.
@@ -444,7 +451,9 @@ public final String toString() {
444451
*
445452
* <p>Some obscure compiler implementations with potentially satanic rituals for initialising
446453
* and configuring components correctly may need to provide a custom implementation here instead.
447-
* In this case, this method should be overridden.
454+
* In this case, this method should be overridden. Base classes are not provided for you to
455+
* extend in this case as this is usually not something you want to be doing. Instead, you should
456+
* implement {@link JctCompilationFactory} directly.
448457
*
449458
* @return the compilation factory.
450459
*/

java-compiler-testing/src/test/java/io/github/ascopes/jct/tests/unit/compilers/AbstractJctCompilerTest.java

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import static org.mockito.Mockito.doThrow;
3030
import static org.mockito.Mockito.mock;
3131
import static org.mockito.Mockito.mockConstruction;
32+
import static org.mockito.Mockito.mockStatic;
3233
import static org.mockito.Mockito.spy;
3334
import static org.mockito.Mockito.verify;
3435
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -47,6 +48,7 @@
4748
import io.github.ascopes.jct.filemanagers.AnnotationProcessorDiscovery;
4849
import io.github.ascopes.jct.filemanagers.JctFileManager;
4950
import io.github.ascopes.jct.filemanagers.JctFileManagerFactory;
51+
import io.github.ascopes.jct.filemanagers.JctFileManagers;
5052
import io.github.ascopes.jct.filemanagers.LoggingMode;
5153
import io.github.ascopes.jct.workspaces.Workspace;
5254
import java.io.IOException;
@@ -85,6 +87,7 @@
8587
import org.mockito.Mock;
8688
import org.mockito.MockedConstruction;
8789
import org.mockito.MockedConstruction.Context;
90+
import org.mockito.MockedStatic;
8891
import org.mockito.junit.jupiter.MockitoExtension;
8992

9093
/**
@@ -103,9 +106,6 @@ class AbstractJctCompilerTest {
103106
@Mock(answer = Answers.RETURNS_MOCKS)
104107
Jsr199CompilerFactory jsr199CompilerFactory;
105108

106-
@Mock(answer = Answers.RETURNS_MOCKS)
107-
JctFileManagerFactory fileManagerFactory;
108-
109109
String name;
110110
String defaultRelease;
111111
CompilerImpl compiler;
@@ -309,14 +309,20 @@ void constructorInitialisesAnnotationProcessorDiscoveryToDefaultValue() {
309309
}
310310

311311
@ExtendWith(MockitoExtension.class)
312-
@SuppressWarnings("unused")
312+
@SuppressWarnings({"unused", "JUnitMalformedDeclaration" /* IDEA-326883 */})
313313
abstract class AbstractCompileTestTemplate {
314314

315315
@Mock
316316
Workspace workspace;
317317

318318
List<String> flags;
319319

320+
@Mock
321+
MockedStatic<JctFileManagers> fileManagers;
322+
323+
@Mock
324+
JctFileManagerFactory fileManagerFactory;
325+
320326
@Mock
321327
JctFileManager fileManager;
322328

@@ -345,6 +351,8 @@ void setUp() {
345351

346352
when(flagBuilderFactory.createFlagBuilder()).thenReturn(flagBuilder);
347353
when(jsr199CompilerFactory.createCompiler()).thenReturn(jsr199Compiler);
354+
fileManagers.when(() -> JctFileManagers.newJctFileManagerFactory(any()))
355+
.thenReturn(fileManagerFactory);
348356
when(fileManagerFactory.createFileManager(any())).thenReturn(fileManager);
349357

350358
// Default implementation. We can override this to make it throw exceptions, etc.
@@ -1558,6 +1566,24 @@ void toStringShouldReturnTheName() {
15581566
assertThat(compiler).hasToString(name);
15591567
}
15601568

1569+
@DisplayName(".getFileManagerFactory() should build a new file manager factory impl")
1570+
@Test
1571+
void getFileManagerFactoryShouldBuildNewFileManagerFactoryImpl() {
1572+
// Given
1573+
try (var fileManagersCls = mockStatic(JctFileManagers.class)) {
1574+
var expectedFactory = mock(JctFileManagerFactory.class);
1575+
fileManagersCls.when(() -> JctFileManagers.newJctFileManagerFactory(any()))
1576+
.thenReturn(expectedFactory);
1577+
1578+
// When
1579+
var actualFactory = compiler.getFileManagerFactory();
1580+
1581+
// Then
1582+
fileManagersCls.verify(() -> JctFileManagers.newJctFileManagerFactory(compiler));
1583+
assertThat(actualFactory).isSameAs(expectedFactory);
1584+
}
1585+
}
1586+
15611587
@DisplayName(".getCompilationFactory() should build a new compilation factory impl")
15621588
@Test
15631589
void getCompilationFactoryBuildsCompilationFactoryImpl() {
@@ -1668,11 +1694,6 @@ public Jsr199CompilerFactory getCompilerFactory() {
16681694
return jsr199CompilerFactory;
16691695
}
16701696

1671-
@Override
1672-
public JctFileManagerFactory getFileManagerFactory() {
1673-
return fileManagerFactory;
1674-
}
1675-
16761697
@Override
16771698
public List<String> buildFlags(JctFlagBuilder flagBuilder) {
16781699
// Promote this method to be public for testing.

0 commit comments

Comments
 (0)