Skip to content

Commit

Permalink
[fixes projectlombok#3781] Replace inefficient Javadoc Regex
Browse files Browse the repository at this point in the history
  • Loading branch information
Rawi01 committed Jan 28, 2025
1 parent 9f9668f commit 03fb4cb
Show file tree
Hide file tree
Showing 5 changed files with 419 additions and 6 deletions.
6 changes: 3 additions & 3 deletions src/core/lombok/core/handlers/HandlerUtil.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 The Project Lombok Authors.
* Copyright (C) 2013-2025 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
Expand Down Expand Up @@ -906,7 +906,7 @@ public enum JavadocTag {
private Pattern pattern;

JavadocTag(String regexpFragment) {
pattern = Pattern.compile("\\s?^[ \\t]*\\**[ \\t]*" + regexpFragment + "(\\S|\\s)*?(?=(\\s^\\s*\\**\\s*@|\\Z))", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
pattern = Pattern.compile("\\s?^[ \\t]*\\**[ \\t]*" + regexpFragment + ".*?(?=(\\s^\\s*\\**\\s*@|\\Z))", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
}
}

Expand Down Expand Up @@ -978,7 +978,7 @@ public static String addJavadocLine(String in, String line) {

public static String getParamJavadoc(String methodComment, String param) {
if (methodComment == null || methodComment.isEmpty()) return methodComment;
Pattern pattern = Pattern.compile("@param " + param + " (\\S|\\s)+?(?=^ ?@|\\z)", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
Pattern pattern = Pattern.compile("@param " + param + " .+?(?=^ ?@|\\z)", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher matcher = pattern.matcher(methodComment);
if (matcher.find()) {
return matcher.group();
Expand Down
6 changes: 3 additions & 3 deletions src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2024 The Project Lombok Authors.
* Copyright (C) 2009-2025 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
Expand Down Expand Up @@ -2799,8 +2799,8 @@ public static Annotation[][] getRecordFieldAnnotations(TypeDeclaration typeDecla
return annotations;
}

private static final Pattern JAVADOC_PATTERN = Pattern.compile("^\\s*\\/\\*\\*((?:\\S|\\s)*?)\\*\\/", Pattern.MULTILINE);
private static final Pattern LEADING_ASTERISKS_PATTERN = Pattern.compile("(?m)^\\s*\\* ?");
private static final Pattern JAVADOC_PATTERN = Pattern.compile("^\\s*\\/\\*\\*(.*?)\\*\\/", Pattern.MULTILINE | Pattern.DOTALL);
private static final Pattern LEADING_ASTERISKS_PATTERN = Pattern.compile("^\\s*\\* ?", Pattern.MULTILINE);

public static String getDocComment(EclipseNode eclipseNode) {
if (eclipseNode.getAst().getSource() == null) return null;
Expand Down
204 changes: 204 additions & 0 deletions test/transform/resource/after-delombok/GetterSetterJavadoc.java
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,207 @@ public GetterSetterJavadoc5 fieldName(final int fieldName) {
return this;
}
}
class GetterSetterJavadocLong {
/**
* This field represents the unique identifier for a user in the system. It is used
* throughout the application to uniquely identify and retrieve user-related data.
* The ID is typically generated by the database and is guaranteed to be unique
* within the context of the system.
*
* <p>The ID is an integral part of various operations, including but not limited to:
* <ul>
* <li>Authenticating users during login processes.</li>
* <li>Associating user-specific preferences and settings.</li>
* <li>Tracking user activity and logs for auditing purposes.</li>
* <li>Facilitating relationships between users and other entities such as orders,
* messages, or roles within the system.</li>
* </ul>
*
* <p>Key characteristics of the {@code userId} field:
* <ul>
* <li><strong>Immutability:</strong> Once assigned, the ID must not be modified to
* ensure data integrity.</li>
* <li><strong>Security:</strong> Access to this field should be controlled to prevent
* unauthorized modifications or data leakage.</li>
* <li><strong>Uniqueness:</strong> The ID must be unique within the system. For
* distributed systems, consider using GUIDs or UUIDs to avoid collisions.</li>
* </ul>
*
* <p>Example usage:
* <pre>
* User user = userService.getUserById(userId);
* if (user != null) {
* System.out.println("User found: " + user.getName());
* } else {
* System.out.println("User not found.");
* }
* </pre>
*
* <p>Developers should ensure that the ID complies with constraints imposed by the
* database schema, such as length and format restrictions. Furthermore, it is
* recommended to validate the ID before persisting or using it in critical operations.
*
* <p>For methods or constructors that accept the {@code userId} as a parameter, the
* following guidelines should be followed:
* <ul>
* <li>Validate the format of the ID to ensure it adheres to system requirements.</li>
* <li>Handle null or empty values gracefully, providing appropriate error messages
* or default behavior where necessary.</li>
* </ul>
*/
private String userId;
@java.lang.SuppressWarnings("all")
@lombok.Generated
public GetterSetterJavadocLong() {
}
/**
* This field represents the unique identifier for a user in the system. It is used
* throughout the application to uniquely identify and retrieve user-related data.
* The ID is typically generated by the database and is guaranteed to be unique
* within the context of the system.
*
* <p>The ID is an integral part of various operations, including but not limited to:
* <ul>
* <li>Authenticating users during login processes.</li>
* <li>Associating user-specific preferences and settings.</li>
* <li>Tracking user activity and logs for auditing purposes.</li>
* <li>Facilitating relationships between users and other entities such as orders,
* messages, or roles within the system.</li>
* </ul>
*
* <p>Key characteristics of the {@code userId} field:
* <ul>
* <li><strong>Immutability:</strong> Once assigned, the ID must not be modified to
* ensure data integrity.</li>
* <li><strong>Security:</strong> Access to this field should be controlled to prevent
* unauthorized modifications or data leakage.</li>
* <li><strong>Uniqueness:</strong> The ID must be unique within the system. For
* distributed systems, consider using GUIDs or UUIDs to avoid collisions.</li>
* </ul>
*
* <p>Example usage:
* <pre>
* User user = userService.getUserById(userId);
* if (user != null) {
* System.out.println("User found: " + user.getName());
* } else {
* System.out.println("User not found.");
* }
* </pre>
*
* <p>Developers should ensure that the ID complies with constraints imposed by the
* database schema, such as length and format restrictions. Furthermore, it is
* recommended to validate the ID before persisting or using it in critical operations.
*
* <p>For methods or constructors that accept the {@code userId} as a parameter, the
* following guidelines should be followed:
* <ul>
* <li>Validate the format of the ID to ensure it adheres to system requirements.</li>
* <li>Handle null or empty values gracefully, providing appropriate error messages
* or default behavior where necessary.</li>
* </ul>
*/
@java.lang.SuppressWarnings("all")
@lombok.Generated
public String getUserId() {
return this.userId;
}
/**
* This field represents the unique identifier for a user in the system. It is used
* throughout the application to uniquely identify and retrieve user-related data.
* The ID is typically generated by the database and is guaranteed to be unique
* within the context of the system.
*
* <p>The ID is an integral part of various operations, including but not limited to:
* <ul>
* <li>Authenticating users during login processes.</li>
* <li>Associating user-specific preferences and settings.</li>
* <li>Tracking user activity and logs for auditing purposes.</li>
* <li>Facilitating relationships between users and other entities such as orders,
* messages, or roles within the system.</li>
* </ul>
*
* <p>Key characteristics of the {@code userId} field:
* <ul>
* <li><strong>Immutability:</strong> Once assigned, the ID must not be modified to
* ensure data integrity.</li>
* <li><strong>Security:</strong> Access to this field should be controlled to prevent
* unauthorized modifications or data leakage.</li>
* <li><strong>Uniqueness:</strong> The ID must be unique within the system. For
* distributed systems, consider using GUIDs or UUIDs to avoid collisions.</li>
* </ul>
*
* <p>Example usage:
* <pre>
* User user = userService.getUserById(userId);
* if (user != null) {
* System.out.println("User found: " + user.getName());
* } else {
* System.out.println("User not found.");
* }
* </pre>
*
* <p>Developers should ensure that the ID complies with constraints imposed by the
* database schema, such as length and format restrictions. Furthermore, it is
* recommended to validate the ID before persisting or using it in critical operations.
*
* <p>For methods or constructors that accept the {@code userId} as a parameter, the
* following guidelines should be followed:
* <ul>
* <li>Validate the format of the ID to ensure it adheres to system requirements.</li>
* <li>Handle null or empty values gracefully, providing appropriate error messages
* or default behavior where necessary.</li>
* </ul>
*
* @param userId the unique identifier assigned to a user. This value must be non-null
* and conform to the format defined by the system. Passing a null or
* invalid ID may result in an {@link IllegalArgumentException} or
* similar error.
* @param databaseConnection the connection to the database used for retrieving or
* persisting the user ID. This parameter is required for
* database-related operations and must be properly closed
* after use to prevent resource leaks.
* @param userRole the role associated with the user (e.g., "admin", "user", "guest").
* This parameter may influence access control and permissions
* granted to the user within the system.
*/
@java.lang.SuppressWarnings("all")
@lombok.Generated
public void setUserId(final String userId) {
this.userId = userId;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@lombok.Generated
public boolean equals(final java.lang.Object o) {
if (o == this) return true;
if (!(o instanceof GetterSetterJavadocLong)) return false;
final GetterSetterJavadocLong other = (GetterSetterJavadocLong) o;
if (!other.canEqual((java.lang.Object) this)) return false;
final java.lang.Object this$userId = this.getUserId();
final java.lang.Object other$userId = other.getUserId();
if (this$userId == null ? other$userId != null : !this$userId.equals(other$userId)) return false;
return true;
}
@java.lang.SuppressWarnings("all")
@lombok.Generated
protected boolean canEqual(final java.lang.Object other) {
return other instanceof GetterSetterJavadocLong;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@lombok.Generated
public int hashCode() {
final int PRIME = 59;
int result = 1;
final java.lang.Object $userId = this.getUserId();
result = result * PRIME + ($userId == null ? 43 : $userId.hashCode());
return result;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@lombok.Generated
public java.lang.String toString() {
return "GetterSetterJavadocLong(userId=" + this.getUserId() + ")";
}
}
Loading

0 comments on commit 03fb4cb

Please sign in to comment.