I. Introduction
In statically typed programming languages, each parameter of a function is given a type, and the compiler is responsible for ensuring that only expressions of the expected type are given as argument. Unfortunately, the detection mechanisms in compilers are defeated if multiple parameters are declared adjacent to each other with the same type. A swap of adjacent arguments at a call site slips through semantic checks as the types of the swapped arguments still match the interface specified. Given a function fn (int x, int y), both fn (1, 2) and fn (2, 1) are valid calls. In addition, due to implicit conversions that are possible in various mainstream programming languages, such as C++, fn (1.5, 3) is also a valid call, even though the function is not directly taking floating-point values. Developers often use the identifier name of the parameter to convey semantic information about the values expected in place of a parameter. While research has been done on understanding natural language for multiple aspects of the software, including identifiers names [1]–[3], the semantic information conveyed by the identifiers themselves are not considered by virtually any compilers of mainstream languages.
Inline with the literature of the field, we will refer to formal parameters appearing in functions’ declarations and definitions as parameters, while the expressions from which actual parameters are calculated will be referred to as arguments.