|  | // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | package com.android.tools.apiusagesample; | 
|  |  | 
|  | import com.android.tools.r8.Diagnostic; | 
|  | import com.android.tools.r8.DiagnosticsHandler; | 
|  | import com.android.tools.r8.errors.InterfaceDesugarMissingTypeDiagnostic; | 
|  | import com.android.tools.r8.origin.ArchiveEntryOrigin; | 
|  | import com.android.tools.r8.origin.Origin; | 
|  | import com.android.tools.r8.origin.PathOrigin; | 
|  | import com.android.tools.r8.position.Position; | 
|  | import com.android.tools.r8.position.TextPosition; | 
|  | import com.android.tools.r8.position.TextRange; | 
|  | import java.nio.file.Files; | 
|  | import java.nio.file.Path; | 
|  |  | 
|  | class D8DiagnosticsHandler implements DiagnosticsHandler { | 
|  |  | 
|  | public D8DiagnosticsHandler() { | 
|  | } | 
|  |  | 
|  | public static Origin getOrigin(Path root, Path entry) { | 
|  | if (Files.isRegularFile(root)) { | 
|  | return new ArchiveEntryOrigin(entry.toString(), new PathOrigin(root)); | 
|  | } else { | 
|  | return new PathOrigin(root.resolve(entry.toString())); | 
|  | } | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void error(Diagnostic error) { | 
|  | convertToMessage(error); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void warning(Diagnostic warning) { | 
|  | if (warning instanceof InterfaceDesugarMissingTypeDiagnostic) { | 
|  | desugarInterfaceMethodInfo((InterfaceDesugarMissingTypeDiagnostic) warning); | 
|  | } else { | 
|  | convertToMessage(warning); | 
|  | } | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void info(Diagnostic info) { | 
|  | convertToMessage(info); | 
|  | } | 
|  |  | 
|  | void desugarInterfaceMethodInfo(InterfaceDesugarMissingTypeDiagnostic info) { | 
|  | System.out.println("desugar is missing: " + info.getMissingType().toString()); | 
|  | System.out.println("  used from: " + info.getContextType().toString()); | 
|  | convertToMessage(info); | 
|  | } | 
|  |  | 
|  | protected void convertToMessage(Diagnostic diagnostic) { | 
|  | String textMessage = diagnostic.getDiagnosticMessage(); | 
|  |  | 
|  | Origin origin = diagnostic.getOrigin(); | 
|  | Position positionInOrigin = diagnostic.getPosition(); | 
|  | String position; | 
|  | if (origin instanceof PathOrigin) { | 
|  | Path originFile = ((PathOrigin) origin).getPath(); | 
|  | if (positionInOrigin instanceof TextRange) { | 
|  | TextRange textRange = (TextRange) positionInOrigin; | 
|  | position = originFile + ": " | 
|  | + textRange.getStart().getLine() + "," + textRange.getStart().getColumn() | 
|  | + " - " + textRange.getEnd().getLine() + "," + textRange.getEnd().getColumn(); | 
|  | } else if (positionInOrigin instanceof TextPosition) { | 
|  | TextPosition textPosition = (TextPosition) positionInOrigin; | 
|  | position = originFile + ": " | 
|  | + textPosition.getLine() + "," + textPosition.getColumn(); | 
|  | } else { | 
|  | position = originFile.toString(); | 
|  | } | 
|  | } else if (origin.parent() instanceof PathOrigin) { | 
|  | Path originFile = ((PathOrigin) origin.parent()).getPath(); | 
|  | position = originFile.toString(); | 
|  | } else { | 
|  | position = "UNKNOWN"; | 
|  | if (origin != Origin.unknown()) { | 
|  | textMessage = origin.toString() + ": " + textMessage; | 
|  | } | 
|  | } | 
|  |  | 
|  | System.out.println(position + ": " + textMessage); | 
|  | } | 
|  | } |