SandboxHintFunctionCallRule.java
/*******************************************************************************
* Copyright (c) 2026 Carsten Hammer and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.sandbox.jdt.triggerpattern.editor;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.Token;
/** Highlights every Java-identifier-shaped function call without a keyword list. */
final class SandboxHintFunctionCallRule implements IRule {
private final IToken token;
SandboxHintFunctionCallRule(IToken token) {
this.token= token;
}
@Override
public IToken evaluate(ICharacterScanner scanner) {
int consumed= 0;
int identifierLength= 0;
int character= scanner.read();
consumed++;
if (character == ICharacterScanner.EOF
|| !Character.isJavaIdentifierStart((char) character)) {
unread(scanner, consumed);
return Token.UNDEFINED;
}
identifierLength= 1;
while (true) {
character= scanner.read();
consumed++;
if (character != ICharacterScanner.EOF
&& Character.isJavaIdentifierPart((char) character)) {
identifierLength++;
continue;
}
break;
}
while (character != ICharacterScanner.EOF && Character.isWhitespace((char) character)) {
character= scanner.read();
consumed++;
}
if (character == '(') {
unread(scanner, consumed - identifierLength);
return token;
}
unread(scanner, consumed);
return Token.UNDEFINED;
}
private static void unread(ICharacterScanner scanner, int count) {
for (int index= 0; index < count; index++) {
scanner.unread();
}
}
}