Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Formatting follow-up #2540

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Ignore commit which reformatted code
2c94c757a6a9426cc2fe47bc1c63f69e7c73b7b4

# Ignore commit which changed line endings consistently to LF
c2a0e4634a2100494159add78db2ee06f5eb9be6
4 changes: 3 additions & 1 deletion .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
### Checklist
<!-- The following checklist is mainly intended for yourself to verify that you did not miss anything -->

- [ ] New code follows the [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)
- [ ] New code follows the [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)\
This is automatically checked by `mvn verify`, but can also be checked on its own using `mvn spotless:check`.\
Style violations can be fixed using `mvn spotless:apply`; this can be done in a separate commit to verify that it did not cause undesired changes.
- [ ] If necessary, new public API validates arguments, for example rejects `null`
- [ ] New public API has Javadoc
- [ ] Javadoc uses `@since $next-version$`
Expand Down
10 changes: 5 additions & 5 deletions Troubleshooting.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,8 @@ For example, let's assume you want to deserialize the following JSON data:
}
```

This will fail with an exception similar to this one: `MalformedJsonException: Use JsonReader.setStrictness(Strictness.LENIENT) to accept malformed JSON at line 5 column 4 path $.languages[2]`
The problem here is the trailing comma (`,`) after `"French"`, trailing commas are not allowed by the JSON specification. The location information "line 5 column 4" points to the `]` in the JSON data (with some slight inaccuracies) because Gson expected another value after `,` instead of the closing `]`. The JSONPath `$.languages[2]` in the exception message also points there: `$.` refers to the root object, `languages` refers to its member of that name and `[2]` refers to the (missing) third value in the JSON array value of that member (numbering starts at 0, so it is `[2]` instead of `[3]`).
This will fail with an exception similar to this one: `MalformedJsonException: Use JsonReader.setStrictness(Strictness.LENIENT) to accept malformed JSON at line 5 column 4 path $.languages[2]`\
The problem here is the trailing comma (`,`) after `"French"`, trailing commas are not allowed by the JSON specification. The location information "line 5 column 4" points to the `]` in the JSON data (with some slight inaccuracies) because Gson expected another value after `,` instead of the closing `]`. The JSONPath `$.languages[2]` in the exception message also points there: `$.` refers to the root object, `languages` refers to its member of that name and `[2]` refers to the (missing) third value in the JSON array value of that member (numbering starts at 0, so it is `[2]` instead of `[3]`).\
The proper solution here is to fix the malformed JSON data.

To spot syntax errors in the JSON data easily you can open it in an editor with support for JSON, for example Visual Studio Code. It will highlight within the JSON data the error location and show why the JSON data is considered invalid.
Expand Down Expand Up @@ -178,8 +178,8 @@ And you want to deserialize the following JSON data:
}
```

This will fail with an exception similar to this one: `IllegalStateException: Expected a string but was BEGIN_ARRAY at line 2 column 17 path $.languages`
This means Gson expected a JSON string value but found the beginning of a JSON array (`[`). The location information "line 2 column 17" points to the `[` in the JSON data (with some slight inaccuracies), so does the JSONPath `$.languages` in the exception message. It refers to the `languages` member of the root object (`$.`).
This will fail with an exception similar to this one: `IllegalStateException: Expected a string but was BEGIN_ARRAY at line 2 column 17 path $.languages`\
This means Gson expected a JSON string value but found the beginning of a JSON array (`[`). The location information "line 2 column 17" points to the `[` in the JSON data (with some slight inaccuracies), so does the JSONPath `$.languages` in the exception message. It refers to the `languages` member of the root object (`$.`).\
The solution here is to change in the `WebPage` class the field `String languages` to `List<String> languages`.

## <a id="adapter-not-null-safe"></a> `IllegalStateException`: "Expected ... but was NULL"
Expand Down Expand Up @@ -287,7 +287,7 @@ This will not initialize arbitrary classes, and it will throw a `ClassCastExcept

## <a id="type-token-raw"></a> `IllegalStateException`: 'TypeToken must be created with a type argument' <br> `RuntimeException`: 'Missing type parameter'

**Symptom:** An `IllegalStateException` with the message 'TypeToken must be created with a type argument' is thrown.
**Symptom:** An `IllegalStateException` with the message 'TypeToken must be created with a type argument' is thrown.\
For older Gson versions a `RuntimeException` with message 'Missing type parameter' is thrown.

**Reason:**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ public void testList() {
// Throws NullPointerException without the fix in https://github.com/google/gson/pull/1103
String json = gson.toJson(sandwiches);
assertEquals(
"{\"sandwiches\":[{\"bread\":\"white\",\"cheese\":\"cheddar\"},{\"bread\":\"whole"
+ " wheat\",\"cheese\":\"swiss\"}]}",
"{\"sandwiches\":[{\"bread\":\"white\",\"cheese\":\"cheddar\"},"
+ "{\"bread\":\"whole wheat\",\"cheese\":\"swiss\"}]}",
json);

MultipleSandwiches sandwichesFromJson = gson.fromJson(json, MultipleSandwiches.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ void testClassWithoutDefaultConstructor() {
assertThat(c.i).isEqualTo(1);

c = gson.fromJson("{}", ClassWithoutDefaultConstructor.class);
// Class is instantiated with JDK Unsafe, so field keeps its default value instead of assigned
// -1
// Class is instantiated with JDK Unsafe, therefore field keeps its default value instead of
// assigned -1
assertThat(c.i).isEqualTo(0);
}

Expand Down
12 changes: 6 additions & 6 deletions gson/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,11 @@
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- Deny illegal access, this is required for ReflectionAccessTest -->
<!-- Requires Java >= 9; Important: In case future Java versions
don't support this flag anymore, don't remove it unless CI also runs with
that Java version. Ideally would use toolchain to specify that this should
run with e.g. Java 11, but Maven toolchain requirements (unlike Gradle ones)
don't seem to be portable (every developer would have to set up toolchain
<!-- Requires Java >= 9; Important: In case future Java versions
don't support this flag anymore, don't remove it unless CI also runs with
that Java version. Ideally would use toolchain to specify that this should
run with e.g. Java 11, but Maven toolchain requirements (unlike Gradle ones)
don't seem to be portable (every developer would have to set up toolchain
configuration locally). -->
<argLine>--illegal-access=deny</argLine>
</configuration>
Expand Down Expand Up @@ -239,7 +239,7 @@
</configuration>
</plugin>
<!-- Add module-info to JAR, see https://github.com/moditect/moditect#adding-module-descriptors-to-existing-jar-files -->
<!-- Uses ModiTect instead of separate maven-compiler-plugin executions
<!-- Uses ModiTect instead of separate maven-compiler-plugin executions
for better Eclipse IDE support, see https://github.com/eclipse-m2e/m2e-core/issues/393 -->
<!-- Note: For some reason this has to be executed before javadoc plugin; otherwise `javadoc:jar` goal fails
to find source files -->
Expand Down
3 changes: 2 additions & 1 deletion gson/src/main/java/com/google/gson/JsonArray.java
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,8 @@ public boolean remove(JsonElement element) {

/**
* Removes the element at the specified position in this array. Shifts any subsequent elements to
* the left (subtracts one from their indices). Returns the element removed from the array.
* the left (subtracts one from their indices). Returns the element that was removed from the
* array.
*
* @param index index the index of the element to be removed
* @return the element previously at the specified position
Expand Down
20 changes: 11 additions & 9 deletions gson/src/main/java/com/google/gson/internal/$Gson$Types.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
/**
/*
* Copyright (C) 2008 Google Inc.
*
* <p>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
* 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
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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
* 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.google.gson.internal;

import static com.google.gson.internal.$Gson$Preconditions.checkArgument;
Expand Down Expand Up @@ -156,8 +159,7 @@ public static Class<?> getRawType(Type type) {
} else {
String className = type == null ? "null" : type.getClass().getName();
throw new IllegalArgumentException(
"Expected a Class, ParameterizedType, or "
+ "GenericArrayType, but <"
"Expected a Class, ParameterizedType, or GenericArrayType, but <"
+ type
+ "> is of type "
+ className);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -303,17 +303,15 @@ public T construct() {
throw new RuntimeException(
"Failed to invoke constructor '"
+ ReflectionHelper.constructorToString(constructor)
+ "'"
+ " with no args",
+ "' with no args",
e);
} catch (InvocationTargetException e) {
// TODO: don't wrap if cause is unchecked?
// TODO: JsonParseException ?
throw new RuntimeException(
"Failed to invoke constructor '"
+ ReflectionHelper.constructorToString(constructor)
+ "'"
+ " with no args",
+ "' with no args",
e.getCause());
} catch (IllegalAccessException e) {
throw ReflectionHelper.createExceptionForUnexpectedIllegalAccess(e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ static int getMajorJavaVersion(String javaVersion) {
version = extractBeginningInt(javaVersion);
}
if (version == -1) {
return 6; // Choose a minimum supported JDK version as default
return 6; // Choose minimum supported JDK version as default
}
return version;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ public <T> T newInstance(Class<T> c) {
throw new UnsupportedOperationException(
"Cannot allocate "
+ c
+ ". Usage of JDK sun.misc.Unsafe is enabled, "
+ "but it could not be used. Make sure your runtime is configured correctly.");
+ ". Usage of JDK sun.misc.Unsafe is enabled, but it could not be used."
+ " Make sure your runtime is configured correctly.");
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ private JsonAdapter getAnnotation(Class<?> rawType) {
return rawType.getAnnotation(JsonAdapter.class);
}

// this is not safe; requires that user has specified correct adapter class for @JsonAdapter
// this is not safe; requires that user has specified correct adapter class for @JsonAdapter
@SuppressWarnings("unchecked")
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> targetType) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,7 @@ void readIntoArray(JsonReader reader, int index, Object[] target)
throw new JsonParseException(
"null is not allowed as value for record component '"
+ fieldName
+ "'"
+ " of primitive type; at path "
+ "' of primitive type; at path "
+ reader.getPath());
}
target[index] = fieldValue;
Expand All @@ -244,8 +243,8 @@ void readIntoField(JsonReader reader, Object target)
checkAccessible(target, field);
} else if (isStaticFinalField) {
// Reflection does not permit setting value of `static final` field, even after calling
// `setAccessible` Handle this here to avoid causing IllegalAccessException when calling
// `Field.set`
// `setAccessible`
// Handle this here to avoid causing IllegalAccessException when calling `Field.set`
String fieldDescription = ReflectionHelper.getAccessibleObjectDescription(field, false);
throw new JsonIOException("Cannot set value of 'static final' " + fieldDescription);
}
Expand Down Expand Up @@ -279,8 +278,7 @@ private static IllegalArgumentException createDuplicateFieldException(
+ declaringType.getName()
+ " declares multiple JSON fields named '"
+ duplicateName
+ "'; conflict is caused"
+ " by fields "
+ "'; conflict is caused by fields "
+ ReflectionHelper.fieldToString(field1)
+ " and "
+ ReflectionHelper.fieldToString(field2)
Expand Down Expand Up @@ -313,8 +311,7 @@ private FieldsData getBoundFields(
+ raw
+ " (supertype of "
+ originalRaw
+ "). Register a TypeAdapter for this type"
+ " or adjust the access filter.");
+ "). Register a TypeAdapter for this type or adjust the access filter.");
}
blockInaccessible = filterResult == FilterResult.BLOCK_INACCESSIBLE;
}
Expand Down Expand Up @@ -603,8 +600,7 @@ void readField(Object[] accumulator, JsonReader in, BoundField field) throws IOE
throw new IllegalStateException(
"Could not find the index in the constructor '"
+ ReflectionHelper.constructorToString(constructor)
+ "'"
+ " for field with name '"
+ "' for field with name '"
+ field.fieldName
+ "', unable to determine which argument in the constructor the field corresponds"
+ " to. This is unexpected behavior, as we expect the RecordComponents to have the"
Expand All @@ -624,22 +620,20 @@ T finalize(Object[] accumulator) {
}
// Note: InstantiationException should be impossible because record class is not abstract;
// IllegalArgumentException should not be possible unless a bad adapter returns objects of
// the wrong type
// the wrong type
catch (InstantiationException | IllegalArgumentException e) {
throw new RuntimeException(
"Failed to invoke constructor '"
+ ReflectionHelper.constructorToString(constructor)
+ "'"
+ " with args "
+ "' with args "
+ Arrays.toString(accumulator),
e);
} catch (InvocationTargetException e) {
// TODO: JsonParseException ?
throw new RuntimeException(
"Failed to invoke constructor '"
+ ReflectionHelper.constructorToString(constructor)
+ "'"
+ " with args "
+ "' with args "
+ Arrays.toString(accumulator),
e.getCause());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ public void write(JsonWriter out, T value) throws IOException {
// Order of preference for choosing type adapters
// First preference: a type adapter registered for the runtime type
// Second preference: a type adapter registered for the declared type
// Third preference: reflective type adapter for the runtime type (if it is a subclass of the
// declared type)
// Third preference: reflective type adapter for the runtime type
// (if it is a subclass of the declared type)
// Fourth preference: reflective type adapter for the declared type

TypeAdapter<T> chosen = delegate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -401,8 +401,8 @@ public void write(JsonWriter out, Number value) throws IOException {
out.nullValue();
} else {
// For backward compatibility don't call `JsonWriter.value(float)` because that method
// has
// been newly added and not all custom JsonWriter implementations might override it yet
// has been newly added and not all custom JsonWriter implementations might override
// it yet
Number floatNumber = value instanceof Float ? value : value.floatValue();
out.value(floatNumber);
}
Expand Down Expand Up @@ -952,7 +952,8 @@ private static final class EnumTypeAdapter<T extends Enum<T>> extends TypeAdapte
public EnumTypeAdapter(final Class<T> classOfT) {
try {
// Uses reflection to find enum constants to work around name mismatches for obfuscated
// classes Reflection access might throw SecurityException, therefore run this in privileged
// classes
// Reflection access might throw SecurityException, therefore run this in privileged
// context; should be acceptable because this only retrieves enum constants, but does not
// expose anything else
Field[] constantFields =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,12 +160,14 @@ public static Date parse(String date, ParsePosition pos) throws ParseException {

// extract day
int day = parseInt(date, offset, offset += 2);

// default time value
int hour = 0;
int minutes = 0;
int seconds = 0;
int milliseconds =
0; // always use 0 otherwise returned date will include millis of current time

// always use 0 otherwise returned date will include millis of current time
Marcono1234 marked this conversation as resolved.
Show resolved Hide resolved
int milliseconds = 0;

// if the value has no time component (and no time zone), we are done
boolean hasT = checkOffset(date, offset, 'T');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,9 @@ public static String tryMakeAccessible(Constructor<?> constructor) {
} catch (Exception exception) {
return "Failed making constructor '"
+ constructorToString(constructor)
+ "' accessible;"
+ " either increase its visibility or write a custom InstanceCreator or TypeAdapter for"
+ "' accessible; either increase its visibility or write a custom InstanceCreator or"
+ " TypeAdapter for its declaring type: "
// Include the message since it might contain more detailed information
+ " its declaring type: "
+ exception.getMessage()
+ getInaccessibleTroubleshootingSuffix(exception);
}
Expand Down
Loading