diff options
author | Kristen Kozak <sebright@google.com> | 2017-12-19 20:02:00 -0800 |
---|---|---|
committer | Kristen Kozak <sebright@google.com> | 2017-12-19 20:02:00 -0800 |
commit | 18cf999ddea65775db2a482e00cea05d52961077 (patch) | |
tree | b78e58794a411fd83e39e6c2211efe664dcaa485 | |
parent | bbe6b10f7c6b622b4ffd18e98f58d96a8eba3854 (diff) | |
download | opencensus-java-18cf999ddea65775db2a482e00cea05d52961077.tar.gz |
Work around a possible bug in the Checker Framework (issue #359).
The issue https://github.com/typetools/checker-framework/issues/1712 affects all
uses of the visitor pattern in this project. This commit adds utility methods
for working around the issue and calls them from all "match" methods.
10 files changed, 119 insertions, 24 deletions
diff --git a/api/src/main/java/io/opencensus/internal/NullnessUtils.java b/api/src/main/java/io/opencensus/internal/NullnessUtils.java new file mode 100644 index 00000000..ca3419cd --- /dev/null +++ b/api/src/main/java/io/opencensus/internal/NullnessUtils.java @@ -0,0 +1,40 @@ +/* + * Copyright 2017, OpenCensus 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 io.opencensus.internal; + +import io.opencensus.common.Function; + +/*>>> +import org.checkerframework.checker.nullness.qual.KeyForBottom; +*/ + +/** Utility methods for working around Checker Framework issues. */ +public final class NullnessUtils { + private NullnessUtils() {} + + /** + * Work around https://github.com/typetools/checker-framework/issues/1712 by removing {@code ? + * super} from a {@code Function}'s argument type. + */ + // TODO(sebright): Remove this method once the issue is fixed. + public static <A, B> Function<A, B> removeSuperFromFunctionParameterType( + Function<? super /*@KeyForBottom*/ A, B> function) { + @SuppressWarnings("unchecked") + Function<A, B> castFunction = (Function<A, B>) function; + return castFunction; + } +} diff --git a/api/src/main/java/io/opencensus/stats/Aggregation.java b/api/src/main/java/io/opencensus/stats/Aggregation.java index 0fe905ce..7a612313 100644 --- a/api/src/main/java/io/opencensus/stats/Aggregation.java +++ b/api/src/main/java/io/opencensus/stats/Aggregation.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.auto.value.AutoValue; import io.opencensus.common.Function; +import io.opencensus.internal.NullnessUtils; import javax.annotation.concurrent.Immutable; /** @@ -79,7 +80,7 @@ public abstract class Aggregation { Function<? super Mean, T> p2, Function<? super Distribution, T> p3, Function<? super Aggregation, T> defaultFunction) { - return p0.apply(this); + return NullnessUtils.<Sum, T>removeSuperFromFunctionParameterType(p0).apply(this); } } @@ -111,7 +112,7 @@ public abstract class Aggregation { Function<? super Mean, T> p2, Function<? super Distribution, T> p3, Function<? super Aggregation, T> defaultFunction) { - return p1.apply(this); + return NullnessUtils.<Count, T>removeSuperFromFunctionParameterType(p1).apply(this); } } @@ -143,7 +144,7 @@ public abstract class Aggregation { Function<? super Mean, T> p2, Function<? super Distribution, T> p3, Function<? super Aggregation, T> defaultFunction) { - return p2.apply(this); + return NullnessUtils.<Mean, T>removeSuperFromFunctionParameterType(p2).apply(this); } } @@ -179,7 +180,7 @@ public abstract class Aggregation { Function<? super Mean, T> p2, Function<? super Distribution, T> p3, Function<? super Aggregation, T> defaultFunction) { - return p3.apply(this); + return NullnessUtils.<Distribution, T>removeSuperFromFunctionParameterType(p3).apply(this); } } } diff --git a/api/src/main/java/io/opencensus/stats/AggregationData.java b/api/src/main/java/io/opencensus/stats/AggregationData.java index 822c9296..bdf618bc 100644 --- a/api/src/main/java/io/opencensus/stats/AggregationData.java +++ b/api/src/main/java/io/opencensus/stats/AggregationData.java @@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.auto.value.AutoValue; import com.google.common.collect.Lists; import io.opencensus.common.Function; +import io.opencensus.internal.NullnessUtils; import java.util.Collections; import java.util.List; import javax.annotation.concurrent.Immutable; @@ -92,7 +93,7 @@ public abstract class AggregationData { Function<? super MeanData, T> p3, Function<? super DistributionData, T> p4, Function<? super AggregationData, T> defaultFunction) { - return p0.apply(this); + return NullnessUtils.<SumDataDouble, T>removeSuperFromFunctionParameterType(p0).apply(this); } } @@ -131,7 +132,7 @@ public abstract class AggregationData { Function<? super MeanData, T> p3, Function<? super DistributionData, T> p4, Function<? super AggregationData, T> defaultFunction) { - return p1.apply(this); + return NullnessUtils.<SumDataLong, T>removeSuperFromFunctionParameterType(p1).apply(this); } } @@ -170,7 +171,7 @@ public abstract class AggregationData { Function<? super MeanData, T> p3, Function<? super DistributionData, T> p4, Function<? super AggregationData, T> defaultFunction) { - return p2.apply(this); + return NullnessUtils.<CountData, T>removeSuperFromFunctionParameterType(p2).apply(this); } } @@ -217,7 +218,7 @@ public abstract class AggregationData { Function<? super MeanData, T> p3, Function<? super DistributionData, T> p4, Function<? super AggregationData, T> defaultFunction) { - return p3.apply(this); + return NullnessUtils.<MeanData, T>removeSuperFromFunctionParameterType(p3).apply(this); } } @@ -317,7 +318,8 @@ public abstract class AggregationData { Function<? super MeanData, T> p3, Function<? super DistributionData, T> p4, Function<? super AggregationData, T> defaultFunction) { - return p4.apply(this); + return NullnessUtils.<DistributionData, T>removeSuperFromFunctionParameterType(p4) + .apply(this); } } } diff --git a/api/src/main/java/io/opencensus/stats/Measure.java b/api/src/main/java/io/opencensus/stats/Measure.java index 209e946f..70210f4e 100644 --- a/api/src/main/java/io/opencensus/stats/Measure.java +++ b/api/src/main/java/io/opencensus/stats/Measure.java @@ -21,6 +21,7 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.auto.value.AutoValue; import com.google.common.annotations.VisibleForTesting; import io.opencensus.common.Function; +import io.opencensus.internal.NullnessUtils; import io.opencensus.internal.StringUtil; import javax.annotation.concurrent.Immutable; @@ -99,7 +100,7 @@ public abstract class Measure { Function<? super MeasureDouble, T> p0, Function<? super MeasureLong, T> p1, Function<? super Measure, T> defaultFunction) { - return p0.apply(this); + return NullnessUtils.<MeasureDouble, T>removeSuperFromFunctionParameterType(p0).apply(this); } @Override @@ -144,7 +145,7 @@ public abstract class Measure { Function<? super MeasureDouble, T> p0, Function<? super MeasureLong, T> p1, Function<? super Measure, T> defaultFunction) { - return p1.apply(this); + return NullnessUtils.<MeasureLong, T>removeSuperFromFunctionParameterType(p1).apply(this); } @Override diff --git a/api/src/main/java/io/opencensus/stats/Measurement.java b/api/src/main/java/io/opencensus/stats/Measurement.java index 6e4b6597..954cf43a 100644 --- a/api/src/main/java/io/opencensus/stats/Measurement.java +++ b/api/src/main/java/io/opencensus/stats/Measurement.java @@ -18,6 +18,7 @@ package io.opencensus.stats; import com.google.auto.value.AutoValue; import io.opencensus.common.Function; +import io.opencensus.internal.NullnessUtils; import io.opencensus.stats.Measure.MeasureDouble; import io.opencensus.stats.Measure.MeasureLong; import javax.annotation.concurrent.Immutable; @@ -62,7 +63,8 @@ public abstract class Measurement { Function<? super MeasurementDouble, T> p0, Function<? super MeasurementLong, T> p1, Function<? super Measurement, T> defaultFunction) { - return p0.apply(this); + return NullnessUtils.<MeasurementDouble, T>removeSuperFromFunctionParameterType(p0) + .apply(this); } } @@ -90,7 +92,7 @@ public abstract class Measurement { Function<? super MeasurementDouble, T> p0, Function<? super MeasurementLong, T> p1, Function<? super Measurement, T> defaultFunction) { - return p1.apply(this); + return NullnessUtils.<MeasurementLong, T>removeSuperFromFunctionParameterType(p1).apply(this); } } } diff --git a/api/src/main/java/io/opencensus/stats/View.java b/api/src/main/java/io/opencensus/stats/View.java index e077baf4..4f852c77 100644 --- a/api/src/main/java/io/opencensus/stats/View.java +++ b/api/src/main/java/io/opencensus/stats/View.java @@ -22,6 +22,7 @@ import com.google.auto.value.AutoValue; import com.google.common.annotations.VisibleForTesting; import io.opencensus.common.Duration; import io.opencensus.common.Function; +import io.opencensus.internal.NullnessUtils; import io.opencensus.internal.StringUtil; import io.opencensus.tags.TagKey; import java.util.ArrayList; @@ -178,7 +179,7 @@ public abstract class View { Function<? super Cumulative, T> p0, Function<? super Interval, T> p1, Function<? super AggregationWindow, T> defaultFunction) { - return p0.apply(this); + return NullnessUtils.<Cumulative, T>removeSuperFromFunctionParameterType(p0).apply(this); } } @@ -220,7 +221,7 @@ public abstract class View { Function<? super Cumulative, T> p0, Function<? super Interval, T> p1, Function<? super AggregationWindow, T> defaultFunction) { - return p1.apply(this); + return NullnessUtils.<Interval, T>removeSuperFromFunctionParameterType(p1).apply(this); } } } diff --git a/api/src/main/java/io/opencensus/stats/ViewData.java b/api/src/main/java/io/opencensus/stats/ViewData.java index c711e6f3..dc8fd555 100644 --- a/api/src/main/java/io/opencensus/stats/ViewData.java +++ b/api/src/main/java/io/opencensus/stats/ViewData.java @@ -23,6 +23,7 @@ import com.google.common.collect.Maps; import io.opencensus.common.Function; import io.opencensus.common.Functions; import io.opencensus.common.Timestamp; +import io.opencensus.internal.NullnessUtils; import io.opencensus.stats.Aggregation.Count; import io.opencensus.stats.Aggregation.Distribution; import io.opencensus.stats.Aggregation.Mean; @@ -237,7 +238,8 @@ public abstract class ViewData { Function<? super CumulativeData, T> p0, Function<? super IntervalData, T> p1, Function<? super AggregationWindowData, T> defaultFunction) { - return p0.apply(this); + return NullnessUtils.<CumulativeData, T>removeSuperFromFunctionParameterType(p0) + .apply(this); } /** Constructs a new {@link CumulativeData}. */ @@ -271,7 +273,7 @@ public abstract class ViewData { Function<? super CumulativeData, T> p0, Function<? super IntervalData, T> p1, Function<? super AggregationWindowData, T> defaultFunction) { - return p1.apply(this); + return NullnessUtils.<IntervalData, T>removeSuperFromFunctionParameterType(p1).apply(this); } /** Constructs a new {@link IntervalData}. */ diff --git a/api/src/main/java/io/opencensus/trace/AttributeValue.java b/api/src/main/java/io/opencensus/trace/AttributeValue.java index 6c938bd6..2de8fc91 100644 --- a/api/src/main/java/io/opencensus/trace/AttributeValue.java +++ b/api/src/main/java/io/opencensus/trace/AttributeValue.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.auto.value.AutoValue; import io.opencensus.common.Function; +import io.opencensus.internal.NullnessUtils; import javax.annotation.concurrent.Immutable; /** @@ -100,7 +101,8 @@ public abstract class AttributeValue { Function<? super Boolean, T> booleanFunction, Function<? super Long, T> longFunction, Function<Object, T> defaultFunction) { - return stringFunction.apply(getStringValue()); + return NullnessUtils.<String, T>removeSuperFromFunctionParameterType(stringFunction) + .apply(getStringValue()); } abstract String getStringValue(); @@ -126,7 +128,8 @@ public abstract class AttributeValue { Function<? super Boolean, T> booleanFunction, Function<? super Long, T> longFunction, Function<Object, T> defaultFunction) { - return booleanFunction.apply(getBooleanValue()); + return NullnessUtils.<Boolean, T>removeSuperFromFunctionParameterType(booleanFunction) + .apply(getBooleanValue()); } abstract Boolean getBooleanValue(); @@ -152,7 +155,8 @@ public abstract class AttributeValue { Function<? super Boolean, T> booleanFunction, Function<? super Long, T> longFunction, Function<Object, T> defaultFunction) { - return longFunction.apply(getLongValue()); + return NullnessUtils.<Long, T>removeSuperFromFunctionParameterType(longFunction) + .apply(getLongValue()); } abstract Long getLongValue(); diff --git a/impl_core/src/main/java/io/opencensus/implcore/internal/NullnessUtils.java b/impl_core/src/main/java/io/opencensus/implcore/internal/NullnessUtils.java new file mode 100644 index 00000000..04ed8f00 --- /dev/null +++ b/impl_core/src/main/java/io/opencensus/implcore/internal/NullnessUtils.java @@ -0,0 +1,40 @@ +/* + * Copyright 2017, OpenCensus 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 io.opencensus.implcore.internal; + +import io.opencensus.common.Function; + +/*>>> +import org.checkerframework.checker.nullness.qual.KeyForBottom; +*/ + +/** Utility methods for working around Checker Framework issues. */ +public final class NullnessUtils { + private NullnessUtils() {} + + /** + * Work around https://github.com/typetools/checker-framework/issues/1712 by removing {@code ? + * super} from a {@code Function}'s argument type. + */ + // TODO(sebright): Remove this method once the issue is fixed. + public static <A, B> Function<A, B> removeSuperFromFunctionParameterType( + Function<? super /*@KeyForBottom*/ A, B> function) { + @SuppressWarnings("unchecked") + Function<A, B> castFunction = (Function<A, B>) function; + return castFunction; + } +} diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableAggregation.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableAggregation.java index deabdce7..1a5771eb 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableAggregation.java +++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableAggregation.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import io.opencensus.common.Function; +import io.opencensus.implcore.internal.NullnessUtils; import io.opencensus.stats.Aggregation; import io.opencensus.stats.BucketBoundaries; @@ -99,7 +100,7 @@ abstract class MutableAggregation { Function<? super MutableCount, T> p1, Function<? super MutableMean, T> p2, Function<? super MutableDistribution, T> p3) { - return p0.apply(this); + return NullnessUtils.<MutableSum, T>removeSuperFromFunctionParameterType(p0).apply(this); } } @@ -145,7 +146,7 @@ abstract class MutableAggregation { Function<? super MutableCount, T> p1, Function<? super MutableMean, T> p2, Function<? super MutableDistribution, T> p3) { - return p1.apply(this); + return NullnessUtils.<MutableCount, T>removeSuperFromFunctionParameterType(p1).apply(this); } } @@ -213,7 +214,7 @@ abstract class MutableAggregation { Function<? super MutableCount, T> p1, Function<? super MutableMean, T> p2, Function<? super MutableDistribution, T> p3) { - return p2.apply(this); + return NullnessUtils.<MutableMean, T>removeSuperFromFunctionParameterType(p2).apply(this); } } @@ -355,7 +356,8 @@ abstract class MutableAggregation { Function<? super MutableCount, T> p1, Function<? super MutableMean, T> p2, Function<? super MutableDistribution, T> p3) { - return p3.apply(this); + return NullnessUtils.<MutableDistribution, T>removeSuperFromFunctionParameterType(p3) + .apply(this); } } } |