Skip to content

Commit

Permalink
Add support for oneway interfaces
Browse files Browse the repository at this point in the history
Test: AidlParserTest
Fixes: 164526282
Change-Id: Ifba7ddf20f83846ec482c11b859cb2cccba10be0

GitOrigin-RevId: 038f6042d0b1a4061924250606e15eb9cd68d074
  • Loading branch information
sprigogin authored and intellij-monorepo-bot committed Mar 18, 2022
1 parent aa5e98a commit b0ac8aa
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -784,52 +784,68 @@ static boolean imports(PsiBuilder b, int l) {
}

/* ********************************************************** */
// INTERFACE_KEYWORD dotted_name SEMICOLON
// | INTERFACE_KEYWORD dotted_name LBRACE interface_member* RBRACE
// [ONEWAY_KEYWORD] INTERFACE_KEYWORD dotted_name SEMICOLON
// | [ONEWAY_KEYWORD] INTERFACE_KEYWORD dotted_name LBRACE interface_member* RBRACE
public static boolean interface_declaration(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "interface_declaration")) return false;
if (!nextTokenIs(b, INTERFACE_KEYWORD)) return false;
if (!nextTokenIs(b, "<interface declaration>", INTERFACE_KEYWORD, ONEWAY_KEYWORD)) return false;
boolean r;
Marker m = enter_section_(b);
Marker m = enter_section_(b, l, _NONE_, INTERFACE_DECLARATION, "<interface declaration>");
r = interface_declaration_0(b, l + 1);
if (!r) r = interface_declaration_1(b, l + 1);
exit_section_(b, m, INTERFACE_DECLARATION, r);
exit_section_(b, l, m, r, false, null);
return r;
}

// INTERFACE_KEYWORD dotted_name SEMICOLON
// [ONEWAY_KEYWORD] INTERFACE_KEYWORD dotted_name SEMICOLON
private static boolean interface_declaration_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "interface_declaration_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, INTERFACE_KEYWORD);
r = interface_declaration_0_0(b, l + 1);
r = r && consumeToken(b, INTERFACE_KEYWORD);
r = r && dotted_name(b, l + 1);
r = r && consumeToken(b, SEMICOLON);
exit_section_(b, m, null, r);
return r;
}

// INTERFACE_KEYWORD dotted_name LBRACE interface_member* RBRACE
// [ONEWAY_KEYWORD]
private static boolean interface_declaration_0_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "interface_declaration_0_0")) return false;
consumeToken(b, ONEWAY_KEYWORD);
return true;
}

// [ONEWAY_KEYWORD] INTERFACE_KEYWORD dotted_name LBRACE interface_member* RBRACE
private static boolean interface_declaration_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "interface_declaration_1")) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, INTERFACE_KEYWORD);
r = interface_declaration_1_0(b, l + 1);
r = r && consumeToken(b, INTERFACE_KEYWORD);
r = r && dotted_name(b, l + 1);
r = r && consumeToken(b, LBRACE);
r = r && interface_declaration_1_3(b, l + 1);
r = r && interface_declaration_1_4(b, l + 1);
r = r && consumeToken(b, RBRACE);
exit_section_(b, m, null, r);
return r;
}

// [ONEWAY_KEYWORD]
private static boolean interface_declaration_1_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "interface_declaration_1_0")) return false;
consumeToken(b, ONEWAY_KEYWORD);
return true;
}

// interface_member*
private static boolean interface_declaration_1_3(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "interface_declaration_1_3")) return false;
private static boolean interface_declaration_1_4(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "interface_declaration_1_4")) return false;
while (true) {
int c = current_position_(b);
if (!interface_member(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "interface_declaration_1_3", c)) break;
if (!empty_element_parsed_guard_(b, "interface_declaration_1_4", c)) break;
}
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,8 @@ private parcelable_member ::= variable_declaration | constant_declaration | decl
constant_declaration ::= CONST_KEYWORD type_element name_component ASSIGN const_expr SEMICOLON

interface_declaration
::= INTERFACE_KEYWORD dotted_name SEMICOLON
| INTERFACE_KEYWORD dotted_name LBRACE interface_member* RBRACE
::= [ONEWAY_KEYWORD] INTERFACE_KEYWORD dotted_name SEMICOLON
| [ONEWAY_KEYWORD] INTERFACE_KEYWORD dotted_name LBRACE interface_member* RBRACE
{
pin=2
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// IWorkManagerImplCallback.aidl
package com.google;

oneway interface IWorkManagerImplCallback {
void onSuccess();
void onFailure(String error);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
FILE
PsiComment(AidlTokenTypes.COMMENT)('// IWorkManagerImplCallback.aidl')
AidlPackageImpl("com.google")
PsiElement(AidlTokenTypes.PACKAGE_KEYWORD)('package')
AidlQualifiedNameImpl("com.google")
AidlNameComponentImpl("com")
PsiElement(AidlTokenTypes.IDENTIFIER)('com')
PsiElement(AidlTokenTypes.DOT)('.')
AidlNameComponentImpl("google")
PsiElement(AidlTokenTypes.IDENTIFIER)('google')
PsiElement(AidlTokenTypes.SEMICOLON)(';')
AidlBodyImpl(BODY)
AidlInterfaceDeclarationImpl("IWorkManagerImplCallback" as in "com.google.IWorkManagerImplCallback")
PsiElement(AidlTokenTypes.ONEWAY_KEYWORD)('oneway')
PsiElement(AidlTokenTypes.INTERFACE_KEYWORD)('interface')
AidlDottedNameImpl("IWorkManagerImplCallback")
AidlNameComponentImpl("IWorkManagerImplCallback")
PsiElement(AidlTokenTypes.IDENTIFIER)('IWorkManagerImplCallback')
PsiElement(AidlTokenTypes.LBRACE)('{')
AidlMethodDeclarationImpl("onSuccess")
AidlTypeElementImpl(TYPE_ELEMENT)
PsiElement(AidlTokenTypes.VOID_KEYWORD)('void')
AidlNameComponentImpl("onSuccess")
PsiElement(AidlTokenTypes.IDENTIFIER)('onSuccess')
PsiElement(AidlTokenTypes.LPAREN)('(')
PsiElement(AidlTokenTypes.RPAREN)(')')
PsiElement(AidlTokenTypes.SEMICOLON)(';')
AidlMethodDeclarationImpl("onFailure")
AidlTypeElementImpl(TYPE_ELEMENT)
PsiElement(AidlTokenTypes.VOID_KEYWORD)('void')
AidlNameComponentImpl("onFailure")
PsiElement(AidlTokenTypes.IDENTIFIER)('onFailure')
PsiElement(AidlTokenTypes.LPAREN)('(')
AidlParameterImpl("error")
AidlTypeElementImpl("String")
AidlQualifiedNameImpl("String")
AidlNameComponentImpl("String")
PsiElement(AidlTokenTypes.IDENTIFIER)('String')
AidlNameComponentImpl("error")
PsiElement(AidlTokenTypes.IDENTIFIER)('error')
PsiElement(AidlTokenTypes.RPAREN)(')')
PsiElement(AidlTokenTypes.SEMICOLON)(';')
PsiElement(AidlTokenTypes.RBRACE)('}')
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@

import com.android.tools.idea.lang.LangTestDataKt;
import com.google.common.base.Charsets;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.rt.execution.junit.FileComparisonFailure;
import com.intellij.testFramework.ParsingTestCase;

import java.io.File;
import kotlin.io.FilesKt;

/**
* Tests for Aidl.bnf.
*/
public class AidlParserTest extends ParsingTestCase {
// If set to true, on test failures the test will rewrite the expected
// text files in place; this makes it more convenient to update the
Expand Down Expand Up @@ -67,6 +67,10 @@ public void testIAidlInterface() {
checkNoErrors();
}

public void testIWorkManagerImplCallback() {
checkNoErrors();
}

public void testParcelable() {
checkNoErrors();
}
Expand Down

0 comments on commit b0ac8aa

Please sign in to comment.