24
24
import java .io .OutputStreamWriter ;
25
25
import java .util .*;
26
26
import java .util .stream .Collectors ;
27
- import java .util .stream .Stream ;
28
27
29
- import edu .emory .mathcs .backport .java .util .Arrays ;
30
28
import org .apache .maven .artifact .Artifact ;
31
29
import org .apache .maven .artifact .factory .ArtifactFactory ;
32
30
import org .apache .maven .artifact .repository .ArtifactRepository ;
@@ -228,6 +226,7 @@ public void execute() throws MojoExecutionException
228
226
229
227
String scalaBinaryVersion = null ;
230
228
String resolvedScalaVersion = resolveScalaVersion ();
229
+ boolean scala2 = true ;
231
230
if ( resolvedScalaVersion != null )
232
231
{
233
232
if ( "2.12" .equals ( resolvedScalaVersion ) || resolvedScalaVersion .startsWith ( "2.12." ) )
@@ -238,9 +237,14 @@ else if ( "2.13".equals( resolvedScalaVersion ) || resolvedScalaVersion.startsWi
238
237
{
239
238
scalaBinaryVersion = "2.13" ;
240
239
}
240
+ else if ( resolvedScalaVersion .compareTo ("3.2." ) > 0 ) // Scala 3 is supported from 3.2.0
241
+ {
242
+ scalaBinaryVersion = "3" ;
243
+ scala2 = false ;
244
+ }
241
245
else
242
246
{
243
- getLog ().warn ( String .format ( "Skipping SCoverage execution - unsupported Scala version \" %s\" " ,
247
+ getLog ().warn ( String .format ( "Skipping SCoverage execution - unsupported Scala version \" %s\" . Supported Scala versions are 2.12.8+, 2.13.0+ and 3.2.0+ . " ,
244
248
resolvedScalaVersion ) );
245
249
return ;
246
250
}
@@ -278,16 +282,18 @@ else if ( "2.13".equals( resolvedScalaVersion ) || resolvedScalaVersion.startsWi
278
282
279
283
try
280
284
{
281
- List <Artifact > pluginArtifacts = getScalaScoveragePluginArtifacts ( resolvedScalaVersion , scalaBinaryVersion );
282
- Artifact runtimeArtifact = getScalaScoverageRuntimeArtifact ( scalaBinaryVersion );
283
-
284
- addScoverageDependenciesToClasspath ( runtimeArtifact );
285
+ List <Artifact > pluginArtifacts = getScalaScoveragePluginArtifacts ( resolvedScalaVersion , scalaBinaryVersion , scala2 );
286
+ if ( scala2 ) // Scala 3 doesn't need scalac-scoverage-runtime
287
+ {
288
+ Artifact runtimeArtifact = getScalaScoverageRuntimeArtifact ( scalaBinaryVersion );
289
+ addScoverageDependenciesToClasspath ( runtimeArtifact );
290
+ }
285
291
286
- String arg = DATA_DIR_OPTION + dataDirectory .getAbsolutePath ();
292
+ String arg = ( scala2 ? SCALA2_DATA_DIR_OPTION : SCALA3_COVERAGE_OUT_OPTION ) + dataDirectory .getAbsolutePath ();
287
293
String _scalacOptions = quoteArgument ( arg );
288
294
String addScalacArgs = arg ;
289
295
290
- arg = SOURCE_ROOT_OPTION + project .getBasedir ().getAbsolutePath ();
296
+ arg = scala2 ? ( SOURCE_ROOT_OPTION + project .getBasedir ().getAbsolutePath () ) : "" ;
291
297
_scalacOptions = _scalacOptions + SPACE + quoteArgument ( arg );
292
298
addScalacArgs = addScalacArgs + PIPE + arg ;
293
299
@@ -305,17 +311,19 @@ else if ( "2.13".equals( resolvedScalaVersion ) || resolvedScalaVersion.startsWi
305
311
addScalacArgs = addScalacArgs + PIPE + arg ;
306
312
}
307
313
308
- if ( highlighting )
314
+ if ( highlighting && scala2 )
309
315
{
310
316
_scalacOptions = _scalacOptions + SPACE + "-Yrangepos" ;
311
317
addScalacArgs = addScalacArgs + PIPE + "-Yrangepos" ;
312
318
}
313
319
314
- String _scalacPlugins = pluginArtifacts .stream ()
315
- .map (x -> String .format ("%s:%s:%s" , x .getGroupId (), x .getArtifactId (),x .getVersion ())).collect (Collectors .joining (" " ));
320
+ String _scalacPlugins = scala2 ? pluginArtifacts .stream ()
321
+ .map (x -> String .format ("%s:%s:%s" , x .getGroupId (), x .getArtifactId (), x .getVersion ())).collect (Collectors .joining (" " )) : "" ;
316
322
317
- arg = PLUGIN_OPTION + pluginArtifacts .stream ().map (x -> x .getFile ().getAbsolutePath ()).collect (Collectors .joining (String .valueOf (java .io .File .pathSeparatorChar )));
318
- addScalacArgs = addScalacArgs + PIPE + arg ;
323
+ if ( scala2 ) {
324
+ arg = PLUGIN_OPTION + pluginArtifacts .stream ().map (x -> x .getFile ().getAbsolutePath ()).collect (Collectors .joining (String .valueOf (java .io .File .pathSeparatorChar )));
325
+ addScalacArgs = addScalacArgs + PIPE + arg ;
326
+ }
319
327
320
328
Properties projectProperties = project .getProperties ();
321
329
@@ -358,9 +366,11 @@ else if ( "2.13".equals( resolvedScalaVersion ) || resolvedScalaVersion.startsWi
358
366
// Private utility methods
359
367
360
368
private static final String SCALA_LIBRARY_GROUP_ID = "org.scala-lang" ;
361
- private static final String SCALA_LIBRARY_ARTIFACT_ID = "scala-library" ;
369
+ private static final String SCALA2_LIBRARY_ARTIFACT_ID = "scala-library" ;
370
+ private static final String SCALA3_LIBRARY_ARTIFACT_ID = "scala3-library_3" ;
362
371
363
- private static final String DATA_DIR_OPTION = "-P:scoverage:dataDir:" ;
372
+ private static final String SCALA2_DATA_DIR_OPTION = "-P:scoverage:dataDir:" ;
373
+ private static final String SCALA3_COVERAGE_OUT_OPTION = "-coverage-out:" ;
364
374
private static final String SOURCE_ROOT_OPTION = "-P:scoverage:sourceRoot:" ;
365
375
private static final String EXCLUDED_PACKAGES_OPTION = "-P:scoverage:excludedPackages:" ;
366
376
private static final String EXCLUDED_FILES_OPTION = "-P:scoverage:excludedFiles:" ;
@@ -378,15 +388,19 @@ private String quoteArgument( String arg )
378
388
private String resolveScalaVersion ()
379
389
{
380
390
String result = scalaVersion ;
381
- if ( result == null )
391
+ if ( result == null || result . isEmpty () )
382
392
{
383
393
// check project direct dependencies (transitive dependencies cannot be checked in this Maven lifecycle phase)
384
394
@ SuppressWarnings ( "unchecked" )
385
395
List <Dependency > dependencies = project .getDependencies ();
386
396
for ( Dependency dependency : dependencies )
387
397
{
388
398
if ( SCALA_LIBRARY_GROUP_ID .equals ( dependency .getGroupId () )
389
- && SCALA_LIBRARY_ARTIFACT_ID .equals ( dependency .getArtifactId () ) )
399
+ && (
400
+ SCALA2_LIBRARY_ARTIFACT_ID .equals ( dependency .getArtifactId () ) ||
401
+ SCALA3_LIBRARY_ARTIFACT_ID .equals ( dependency .getArtifactId () )
402
+ )
403
+ )
390
404
{
391
405
result = dependency .getVersion ();
392
406
break ;
@@ -428,22 +442,25 @@ private ArtifactVersion getScalacPluginVersion() {
428
442
}
429
443
}
430
444
431
- private List <Artifact > getScalaScoveragePluginArtifacts (String resolvedScalaVersion , String scalaMainVersion )
445
+ private List <Artifact > getScalaScoveragePluginArtifacts ( String resolvedScalaVersion , String scalaBinaryVersion , boolean scala2 )
432
446
throws ArtifactNotFoundException , ArtifactResolutionException
433
447
{
434
448
String resolvedScalacPluginVersion = getScalacPluginVersion ().toString ();
435
449
List <Artifact > resolvedArtifacts = new ArrayList <>();
436
- resolvedArtifacts .add (getResolvedArtifact ("org.scoverage" , "scalac-scoverage-plugin_" + resolvedScalaVersion , resolvedScalacPluginVersion ));
437
- resolvedArtifacts .add (getResolvedArtifact ("org.scoverage" , "scalac-scoverage-domain_" + scalaMainVersion , resolvedScalacPluginVersion ));
438
- resolvedArtifacts .add (getResolvedArtifact ("org.scoverage" , "scalac-scoverage-serializer_" + scalaMainVersion , resolvedScalacPluginVersion ));
450
+ if ( scala2 ) // Scala 3 doesn't need scalac-scoverage-plugin
451
+ {
452
+ resolvedArtifacts .add (getResolvedArtifact ("org.scoverage" , "scalac-scoverage-plugin_" + resolvedScalaVersion , resolvedScalacPluginVersion ));
453
+ }
454
+ resolvedArtifacts .add (getResolvedArtifact ("org.scoverage" , "scalac-scoverage-domain_" + scalaBinaryVersion , resolvedScalacPluginVersion ));
455
+ resolvedArtifacts .add (getResolvedArtifact ("org.scoverage" , "scalac-scoverage-serializer_" + scalaBinaryVersion , resolvedScalacPluginVersion ));
439
456
return resolvedArtifacts ;
440
457
}
441
458
442
- private Artifact getScalaScoverageRuntimeArtifact ( String scalaMainVersion )
459
+ private Artifact getScalaScoverageRuntimeArtifact ( String scalaBinaryVersion )
443
460
throws ArtifactNotFoundException , ArtifactResolutionException
444
461
{
445
462
return getResolvedArtifact (
446
- "org.scoverage" , "scalac-scoverage-runtime_" + scalaMainVersion ,
463
+ "org.scoverage" , "scalac-scoverage-runtime_" + scalaBinaryVersion ,
447
464
getScalacPluginVersion ().toString () );
448
465
}
449
466
0 commit comments