-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(error_templates/java): implement edge case for expected error
- Loading branch information
Showing
4 changed files
with
225 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
5 changes: 5 additions & 0 deletions
5
error_templates/java/test_files/identifier_expected_error_complex_2/Main.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
public clas Main { | ||
public static void main(String args[]) { | ||
String text = null; | ||
} | ||
} |
33 changes: 33 additions & 0 deletions
33
error_templates/java/test_files/identifier_expected_error_complex_2/test.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
name: "Complex2" | ||
template: "Java.IdentifierExpectedError" | ||
--- | ||
Main.java:1: error: class, interface, or enum expected | ||
public clas Main { | ||
^ | ||
Main.java:2: error: class, interface, or enum expected | ||
public static void main(String args[]) { | ||
^ | ||
Main.java:4: error: class, interface, or enum expected | ||
} | ||
^ | ||
3 errors | ||
=== | ||
template: "Java.IdentifierExpectedError" | ||
--- | ||
# IdentifierExpectedError | ||
This error occurs when there's a typo or the keyword `class`, `interface`, or `enum` is missing. | ||
``` | ||
public clas Main { | ||
^^^^ | ||
public static void main(String args[]) { | ||
String text = null; | ||
``` | ||
## Steps to fix | ||
### Correct the typo | ||
Change `clas` to `class` to properly declare the class. | ||
```diff | ||
- public clas Main { | ||
+ public class Main { | ||
public static void main(String args[]) { | ||
String text = null; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// Package levenshtein is a Go implementation to calculate Levenshtein Distance. | ||
// | ||
// Implementation taken from: https://github.com/agnivade/levenshtein/blob/master/levenshtein.go | ||
// and originally from: https://gist.github.com/andrei-m/982927#gistcomment-1931258 | ||
package levenshtein | ||
|
||
import "unicode/utf8" | ||
|
||
// minLengthThreshold is the length of the string beyond which | ||
// an allocation will be made. Strings smaller than this will be | ||
// zero alloc. | ||
const minLengthThreshold = 32 | ||
|
||
// ComputeDistance computes the levenshtein distance between the two | ||
// strings passed as an argument. The return value is the levenshtein distance | ||
// | ||
// Works on runes (Unicode code points) but does not normalize | ||
// the input strings. See https://blog.golang.org/normalization | ||
// and the golang.org/x/text/unicode/norm package. | ||
func ComputeDistance(a, b string) int { | ||
if len(a) == 0 { | ||
return utf8.RuneCountInString(b) | ||
} | ||
|
||
if len(b) == 0 { | ||
return utf8.RuneCountInString(a) | ||
} | ||
|
||
if a == b { | ||
return 0 | ||
} | ||
|
||
// We need to convert to []rune if the strings are non-ASCII. | ||
// This could be avoided by using utf8.RuneCountInString | ||
// and then doing some juggling with rune indices, | ||
// but leads to far more bounds checks. It is a reasonable trade-off. | ||
s1 := []rune(a) | ||
s2 := []rune(b) | ||
|
||
// swap to save some memory O(min(a,b)) instead of O(a) | ||
if len(s1) > len(s2) { | ||
s1, s2 = s2, s1 | ||
} | ||
lenS1 := len(s1) | ||
lenS2 := len(s2) | ||
|
||
// Init the row. | ||
var x []uint16 | ||
if lenS1+1 > minLengthThreshold { | ||
x = make([]uint16, lenS1+1) | ||
} else { | ||
// We make a small optimization here for small strings. | ||
// Because a slice of constant length is effectively an array, | ||
// it does not allocate. So we can re-slice it to the right length | ||
// as long as it is below a desired threshold. | ||
x = make([]uint16, minLengthThreshold) | ||
x = x[:lenS1+1] | ||
} | ||
|
||
// we start from 1 because index 0 is already 0. | ||
for i := 1; i < len(x); i++ { | ||
x[i] = uint16(i) | ||
} | ||
|
||
// make a dummy bounds check to prevent the 2 bounds check down below. | ||
// The one inside the loop is particularly costly. | ||
_ = x[lenS1] | ||
// fill in the rest | ||
for i := 1; i <= lenS2; i++ { | ||
prev := uint16(i) | ||
for j := 1; j <= lenS1; j++ { | ||
current := x[j-1] // match | ||
if s2[i-1] != s1[j-1] { | ||
current = min(min(x[j-1]+1, prev+1), x[j]+1) | ||
} | ||
x[j-1] = prev | ||
prev = current | ||
} | ||
x[lenS1] = prev | ||
} | ||
return int(x[lenS1]) | ||
} | ||
|
||
func min(a, b uint16) uint16 { | ||
if a < b { | ||
return a | ||
} | ||
return b | ||
} |