/*
* Copyright 2017-present Facebook, Inc.
*
* 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 com.facebook.buck.jvm.java.plugin.adapter;
import com.facebook.buck.jvm.java.plugin.api.BuckJavacTaskListener;
import com.facebook.buck.jvm.java.plugin.api.CompilationUnitTreeProxy;
import com.facebook.buck.jvm.java.plugin.api.TaskEventMirror;
import com.facebook.buck.util.liteinfersupport.Nullable;
import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.util.TaskEvent;
import com.sun.source.util.TaskListener;
/**
* Implements {@link TaskListener} by proxying calls to an inner {@link BuckJavacTaskListener}. This
* is the bridge that allows us to implement {@link TaskListener}s in Buck itself.
*/
public class BuckJavacTaskListenerProxy implements TaskListener {
private final BuckJavacTaskListener buckSideListener;
public BuckJavacTaskListenerProxy(BuckJavacTaskListener buckSideListener) {
if (buckSideListener instanceof TaskListenerProxy) {
throw new IllegalArgumentException(
"taskListener is a proxy, unwrap it rather than creating another proxy");
}
this.buckSideListener = buckSideListener;
}
@Override
public void started(TaskEvent e) {
this.buckSideListener.started(mirrorTaskEvent(e));
}
@Override
public void finished(TaskEvent e) {
this.buckSideListener.finished(mirrorTaskEvent(e));
}
private TaskEventMirror mirrorTaskEvent(TaskEvent e) {
return new TaskEventMirror(
e,
mirrorKind(e.getKind()),
e.getSourceFile(),
proxyCompilationUnit(e.getCompilationUnit()),
e.getTypeElement());
}
private TaskEventMirror.Kind mirrorKind(TaskEvent.Kind kind) {
return TaskEventMirror.Kind.valueOf(kind.name());
}
@Nullable
private CompilationUnitTreeProxy proxyCompilationUnit(@Nullable CompilationUnitTree tree) {
if (tree == null) {
return null;
}
return new CompilationUnitTreeProxyImpl(tree);
}
}