Hone logo
Hone
Problems

Angular Signature Help Implementation

This challenge focuses on building a core feature for developer productivity: signature help. Imagine typing a function call in your IDE and automatically seeing the function's parameters, their types, and descriptions. This is signature help, and you'll implement a simplified version within an Angular application.

Problem Description

Your task is to create an Angular component that displays signature help for a given function signature. This component should appear dynamically when a user triggers it (simulated by a button click in this challenge) and provide context about the function's parameters as the user types within a simulated input field.

Key Requirements:

  • Component Structure: Create an Angular component (e.g., SignatureHelpComponent) responsible for displaying the signature help.
  • Data Input: The component should accept a functionSignature object as an input. This object will contain information about the function's name, parameters (including name, type, and optional description), and a general description of the function.
  • Triggering Mechanism: For this challenge, simulate the triggering of signature help with a button. When the button is clicked, the SignatureHelpComponent should become visible.
  • Parameter Highlighting: As the user "types" (simulated by advancing through parameters), the currently active parameter within the signature help should be highlighted.
  • Display: The signature help should display:
    • The function name.
    • A list of parameters, each showing its name and type.
    • The description of the currently active parameter.
    • The overall function description.
  • Navigation (Simulated): Implement a way to cycle through the parameters, simulating a user typing commas or pressing tab. This can be achieved with additional buttons or a simple counter.

Expected Behavior:

  1. When the "Show Signature Help" button is clicked, the SignatureHelpComponent appears.
  2. The component initially displays the first parameter as active.
  3. Clicking a "Next Parameter" button (or equivalent) advances the active parameter.
  4. The displayed parameter description updates to match the currently active parameter.
  5. The component should handle cases where there are no parameters.
  6. The component should gracefully handle reaching the end of the parameter list.

Edge Cases:

  • Functions with no parameters.
  • Functions with only one parameter.
  • Reaching the end of the parameter list and cycling back to the beginning or stopping.

Examples

Example 1:

Component Template (Conceptual):

<div class="signature-help">
  <div class="function-signature">
    <span class="function-name">{{ signature.name }}</span>(
    <span *ngFor="let param of signature.parameters; let i = index"
          [class.active-param]="i === activeParamIndex">
      {{ param.name }}: {{ param.type }}{{ i < signature.parameters.length - 1 ? ',' : '' }}
    </span>)
  </div>
  <div class="parameter-description">
    <p>{{ currentParamDescription }}</p>
  </div>
  <div class="function-description">
    <p>{{ signature.description }}</p>
  </div>
  <button (click)="nextParameter()">Next Parameter</button>
</div>

Component Logic (Conceptual):

interface Parameter {
  name: string;
  type: string;
  description?: string;
}

interface FunctionSignature {
  name: string;
  parameters: Parameter[];
  description: string;
}

@Component({...})
export class SignatureHelpComponent implements OnInit {
  @Input() signature: FunctionSignature;
  activeParamIndex: number = 0;
  currentParamDescription: string = '';

  ngOnInit() {
    this.updateParameterDescription();
  }

  updateParameterDescription() {
    if (this.signature && this.signature.parameters && this.signature.parameters.length > 0) {
      const currentParam = this.signature.parameters[this.activeParamIndex];
      this.currentParamDescription = currentParam.description || 'No description available.';
    } else {
      this.currentParamDescription = 'This function has no parameters.';
    }
  }

  nextParameter() {
    if (this.signature && this.signature.parameters && this.signature.parameters.length > 0) {
      this.activeParamIndex = (this.activeParamIndex + 1) % this.signature.parameters.length;
      this.updateParameterDescription();
    }
  }
}

Parent Component (Conceptual):

<button (click)="showHelp()">Show Signature Help</button>
<app-signature-help *ngIf="showSignatureHelp" [signature]="selectedFunctionSignature"></app-signature-help>

Parent Component Logic (Conceptual):

// ... in your parent component class ...
selectedFunctionSignature: FunctionSignature = {
  name: 'createUser',
  parameters: [
    { name: 'firstName', type: 'string', description: 'The first name of the user.' },
    { name: 'lastName', type: 'string', description: 'The last name of the user.' },
    { name: 'age', type: 'number', description: 'The age of the user.' },
    { name: 'isActive', type: 'boolean', description: 'Indicates if the user account is active.' }
  ],
  description: 'Creates a new user record in the system.'
};
showSignatureHelp: boolean = false;

showHelp() {
  this.showSignatureHelp = true;
}
// ...

Input Data:

const exampleSignature: FunctionSignature = {
  name: 'formatDate',
  parameters: [
    { name: 'date', type: 'Date', description: 'The date object to format.' },
    { name: 'formatString', type: 'string', description: 'Optional: the desired output format (e.g., "YYYY-MM-DD").' }
  ],
  description: 'Formats a Date object into a human-readable string.'
};

Expected Output (when 'formatDate' help is shown and 'Next Parameter' is clicked once):

The SignatureHelpComponent would display:

formatDate(date: Date, [lastName]: string)
The last name of the user.
Creates a new user record in the system.
[Next Parameter Button]

(Assuming selectedFunctionSignature from the parent component is used). The lastName parameter would be highlighted, and its description would be shown.

Explanation:

The component displays the function name and its parameters. The second parameter (lastName) is highlighted, and its description is shown below. The overall function description is also visible.

Example 2: Function with No Parameters

Input Data:

const noParamSignature: FunctionSignature = {
  name: 'initializeApp',
  parameters: [],
  description: 'Initializes the application and sets up core services.'
};

Expected Output (when 'initializeApp' help is shown):

The SignatureHelpComponent would display:

initializeApp()
This function has no parameters.
Initializes the application and sets up core services.
[Next Parameter Button - might be disabled or do nothing]

Explanation:

Since there are no parameters, the component displays a message indicating this, along with the function description.

Constraints

  • Your solution should be built using Angular version 15 or later.
  • Use TypeScript for all component logic and type definitions.
  • The solution should be deployable as a standalone Angular component.
  • Focus on the core logic of displaying and navigating signature help; complex UI styling is secondary.

Notes

  • Consider how you would manage the state of the active parameter.
  • Think about how to handle the cyclical nature of parameter navigation.
  • The "triggering" mechanism is simplified for this challenge. In a real IDE, this would be tied to cursor position and typing events.
  • You can create mock data for FunctionSignature to test your component.
  • Consider using Angular's Input and OnInit lifecycle hooks effectively.
Loading editor...
typescript